Main Page

From
Revision as of 12:26, 13 May 2018 by Admin (talk | contribs) (Software)
Jump to: navigation, search
  ____ ___  _   _ _____ _   _ ____   ___ _____     
 / ___/ _ \| \ | |_   _| | | | __ ) / _ \_   _|   
| |  | | | |  \| | | | | | | |  _ \| | | || |     
| |__| |_| | |\  | | | | |_| | |_) | |_| || |   
 \____\___/|_| \_| |_|  \___/|____/ \___/ |_|    
                                                                       
              CONTUbernio roBOTics

ROBOTS

Le 3 leggi della robotica

  1. “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”.
  2. “Un robot deve obbedire agli ordini impartiti dagli esseri umani purché tali ordini non contravvengano alla prima legge”.
  3. “Un robot deve proteggere la propria esistenza purché questo non contrasti con la prima e la seconda legge”.

Isaac Asimov

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
  1. iniziare con il thymio

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:

  1. programmare il robot in modo che non esca dal ring
  2. programmare il proprio robot per spingere il robot avversario fuori dal ring
  3. 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);
}