Main Page
____ ___ _ _ _____ _ _ ____ ___ _____ / ___/ _ \| \ | |_ _| | | | __ ) / _ \_ _| | | | | | | \| | | | | | | | _ \| | | || | | |__| |_| | |\ | | | | |_| | |_) | |_| || | \____\___/|_| \_| |_| \___/|____/ \___/ |_| CONTUbernio roBOTics
Contents
ROBOTS
Le 3 leggi della robotica
- “Un robot non può recar danno a un essere umano né può permettere che a causa del proprio mancato intervento un essere umano riceva danno”.
- “Un robot deve obbedire agli ordini impartiti dagli esseri umani purché tali ordini non contravvengano alla prima legge”.
- “Un robot deve proteggere la propria esistenza purché questo non contrasti con la prima e la seconda legge”.
THYMIO
Programmi preimpostati
COMPORTAMENTO | COLORE | SPIEGAZIONE |
---|---|---|
ESPLORATORE | giallo | evita gli ostacoli |
AMICONE | verde | segue un amico |
FIFONE | rosso | cerca di non farsi acchiappare |
CURIOSO | bianco | inseguitore di linea |
OBBEDIENTE | fucsia | si può controllare con le frecce |
ATTENTO | azzurro | reagisce ai suoni |
Inseguitore di linea
La traccia deve essere almeno larga 4 cm con alto contrasto rispetto al terreno. Il meglio è nero su bianco. Il livello di riconoscimento della traccia può essere calibrato quando la modalità 'Investigatore' viene attivata:
- Premere simultaneamente entrambe le frecce avanti e indietro con i sensori inferiori sulla traccia, per calibrare il livello del nero.
- Premere simultaneamente entrambe le frecce destra e sinistra con i sensori inferiori su un'area bianca per calibrare il livello del bianco.
SUMO
2 robot su un ring lottano per spingere l'avversario fuori dal ring
Le regole:
- si programmano i robot
- una volta iniziata la gara non si possono toccare i robot
- vince chi riesce a spingere l'altro fuori dal ring
- si ha un pareggio se entro un certo tempo nessuno dei 2 riesce a spingere l'altro fuori
Obiettivi nel fare il programma:
- programmare il robot in modo che non esca dal ring
- programmare il proprio robot per spingere il robot avversario fuori dal ring
- programmare il robot per evitare sia spinto fuori dal ring
CONTUBOT1
Hardware
PIN ALIMENTAZIONE
CONTROLLER | PIN | DRIVER MOTORI |
(+) PILA | VIN | VM |
(-) PILA | GND | GND |
5V | VCC |
PIN DIGITALI
CONTROLLER | PIN | DRIVER MOTORI |
+ pila | VIN | X |
- pila | GND | X |
RX | D00 | X |
TX | D01 | X |
ENC1 | D02 | X |
ENC2 | D03 | X |
... | D04 | - |
... | D05 | - |
... | D06 | - |
... | D07 | - |
... | D08 | - |
... | D09 | - |
... | D10 | - |
... | D11 | - |
... | D12 | - |
LED | D13 | - |
Software
Programma CONTUBOT1 - EXPLORER
#define pinLED 13
#define pinRX 0
#define pinTX 1
// MOTOR LEFT
// power
#define pinWheelL_PWMA 5
// dir
#define pinWheelL_AIN1 8
#define pinWheelL_AIN2 9
// MOTOR RIGHT
// power
#define pinWheelR_PWMB 6
// dir
#define pinWheelR_BIN2 11
#define pinWheelR_BIN1 12
// ENCODER
#define pinWheelL_ENCD 2
#define pinWheelR_ENCD 3
// ULTRASOUND
#define pinUS_TRIG 10
#define pinUS_ECHO 4
#define pinWheelStandby 7
#define MAXPOWER 255
#define STEPS_L 5
#define STEPS_R 5
#define STEPS_B 10
#define STEPS_F 20
// A01,A02 // LEFT MOTOR
// B01,B02 // LEFT MOTOR
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
const int Nt=2;
unsigned long t0_ms[Nt]; // will store last time LED was updated
// constants won't change :
long dt_ms[Nt]; // interval at which to do something
// ROBOT MODE
#define EXPLORER 0 // explorer
#define LFOLLOWER 1 // explorer
int robotMode=EXPLORER;
#define MAXSPEED 255
int speedR=MAXSPEED;
int speedL=MAXSPEED;
void setup() {
// put your setup code here, to run once:
Serial.begin(57600);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(pinWheelL_AIN1, OUTPUT);
pinMode(pinWheelL_AIN2, OUTPUT);
pinMode(pinWheelR_BIN1, OUTPUT);
pinMode(pinWheelR_BIN2, OUTPUT);
// SONAR
pinMode(pinUS_TRIG, OUTPUT);
pinMode(pinUS_ECHO, INPUT);
//
pinMode(pinWheelStandby, OUTPUT);
digitalWrite(pinWheelStandby, HIGH);
dt_ms[0] = 10; // interval at which to avareage angular velocity
//Serial.println("> Ready!");
}
void loop() {
unsigned long t_ms = millis();
//
// check against collision system
if (t_ms - t0_ms[2] >= dt_ms[2]) {
// save the last time you did it
t0_ms[0] = t_ms;
int d=ultrasound();
setMotor(255,255);
if (d<10) {
Serial.println(d);
}
}
}
// Function to Spin Right
void setMotor(int speedL, int speedR) {
int speedLabs=abs(speedL);
int speedRabs=abs(speedR);
if (speedL>0) {
digitalWrite(pinWheelL_AIN1, LOW);
digitalWrite(pinWheelL_AIN2, HIGH);
}
if (speedL<0) {
digitalWrite(pinWheelL_AIN1, HIGH);
digitalWrite(pinWheelL_AIN2, LOW);
}
if (speedR>0) {
digitalWrite(pinWheelR_BIN1, LOW);
digitalWrite(pinWheelR_BIN2, HIGH);
}
if (speedR<0) {
digitalWrite(pinWheelR_BIN1, HIGH);
digitalWrite(pinWheelR_BIN2, LOW);
}
// set power
analogWrite(pinWheelL_PWMA, speedLabs);
analogWrite(pinWheelR_PWMB, speedRabs);
}
long ultrasound() {
digitalWrite(pinUS_TRIG, LOW); // Added this line
delayMicroseconds(2); // Added this line
digitalWrite(pinUS_TRIG, HIGH);
// delayMicroseconds(1000); - Removed this line
delayMicroseconds(10); // Added this line
digitalWrite(pinUS_TRIG, LOW);
long duration_us = pulseIn(pinUS_ECHO, HIGH);
long distance_cm = (duration_us/2) / 29.1;
if (distance_cm<200) {
Serial.println(distance_cm);
}
//delay(10);
return(distance_cm);
}