Da vinci, è un semplice robottino costruito da me un po’ di tempo fa. Durante la sua progettazione ho cercato di spendere meno denaro possibile e per questo ho trovato un modo semplice ed economico per rendere la mia creatura più autonoma. Invece di usare i rinomati sensori di prossimità (infrarossi o ancora meglio) a ultrasuoni ho usato due led ir (o infrarossi) che collegati in un modo preciso e abbinati ad un algoritmo generano le stesse funzionalità.

Per quanto riguarda il resto oltre ad avere già la board arduino vengono usati due servi, una coppia di ruote, due led ir, la scocca del robot è un prima ottagonale ritaglia da una lamina di compensato.

Codice per arduino:

#include <Servo.h>

#define irEmitter 12            // polo positivo emettitore
#define irReceiverN 11          // polo negativo ricevitore
#define irReceiverP 10          // polo positivo ricevitore
#define led1 5
#define led2 3
long distance = 0;
int interval = 0;

Servo servo1;  

Servo servo2;                

int pos = 0;    // variabile per settare la posizione del servo

void setup()
{
  servo1.attach(9);  // servo1 collegato al pin 9 e il 2 al pin 6
  servo2.attach(6);
    Serial.begin(9600);              // inizializza seriale a 9600 baud
  pinMode(irEmitter, OUTPUT);      // il led emettitore è un output
  pinMode(irReceiverP, OUTPUT);    // il polo positivo del let ricevitore è un output
  digitalWrite(irReceiverP, LOW);  // e deve essere LOW
}

void focus(int focusPoint) {
  interval = focusPoint;
  distance = readLight(true) - readLight(false);
  if(distance < 0) distance = 0;
  // processing
  Serial.println(distance);
}

double readLight(boolean lightOn) {
  digitalWrite(irEmitter, lightOn ? HIGH : LOW);
  pinMode(irReceiverN, OUTPUT);
  digitalWrite(irReceiverN, HIGH); //carico ricevitore di induttanza
  long reading = 0;
  pinMode(irReceiverN, INPUT);
  digitalWrite(irReceiverN, LOW);
  long lightTime = millis();
  while((millis() - lightTime) < interval)
    if(digitalRead(irReceiverN) == 0)
      reading++;

  return reading;
} 

void loop()
{

   int x = analogRead(A0);

    if (x > 520) {

   analogWrite(led1, 255);
   analogWrite(led2, 255);
    }
    else {

   analogWrite(led1, 0);
   analogWrite(led2, 0);

    }

    focus(115);

    if (distance > 4000){              // il valore 4000 è ipotetico si deve impostare in base alle condizioni di luce

      servo1.write(180);               // gira a destra
      servo2.write(90);
    }
    else {
      servo1.write(180);               // prosegui dritto
      servo2.write(- 180);

    }
  }