Giacomo Furia

Giacomo Furia

(1 commenti, 4 articoli)

Questo utente non ha condiviso alcuna informazione del profilo

Articoli di Giacomo Furia
picotrequarti

Robot Self-Balancing

0

Salve a tutti vi presento un progetto molto carino e accattivante basato, come al solito, su Arduino: è un semplice robot a due ruote, che, invece di avere una terza ruota pivotante per mantenersi in equilibrio, sfrutta un sistema di rivelatori di distanza che gli permettono di restare sempre in piedi nella posizione corretta. Per fare ciò, infatti, impiega due sensori di prossimità (in questo caso Sharp) molto economici, con un range tra i 50 cm e i 3 cm. L’algoritmo che ne permette il funzionamento, infatti, prende in input i valori dei due sensori: se la loro differenza è prossima a 0, allora permette ai due servi di muoversi.

Questa è la prima versione del codice che contiene ancora delle incertezze, infatti se il robot si inclina eccessivamente in avanti o indietro e resta inclinato sul pavimento non è in grado di modificare autonomamente la sua posizione.

Prima versione del codice:

 

Servo left;
Servo right;

#define servoLeftPin     9
#define servoRightPin   10
#define servoZero       81
#define IRFront         0
#define IRBack          1
#define ledPin          13

int frontSense = 0;
int backSense = 0;
int orientation = 0;

void setup() {
pinMode(ledPin, OUTPUT);
left.attach(servoLeftPin);
right.attach(servoRightPin);
left.write(servoZero);
right.write(servoZero);
Serial.begin(9600);
}

void getOrientation() {
  frontSense = 0;
  backSense = 0;
  orientation = 0;
 for (int i = 0; i < 10; i++) {
  frontSense = analogRead(IRFront) + frontSense;
  backSense = analogRead(IRBack) + backSense;
  if (i == 9) {
   frontSense = frontSense / 10;
   backSense = backSense / 10;
   orientation = frontSense - backSense;
  }
 }
}

void loop() {
getOrientation();

float delta = orientation / 8;
if(delta > 90) delta = 90;
if(delta < -90) delta = -90;
left.write(81 - delta);
right.write(81 + delta);
Serial.println(orientation);
}
Seconda versione del codice che elimina il problema:
Servo left;
Servo right;

#define servoLeftPin     9
#define servoRightPin   10
#define servoZero       81
#define IRFront         0
#define IRBack          1
#define ledPin          13

int frontSense = 0;
int backSense = 0;
int orientation = 0;
int fall = 0;

void setup() {
pinMode(ledPin, OUTPUT);
left.attach(servoLeftPin);
right.attach(servoRightPin);
left.write(servoZero);
right.write(servoZero);
Serial.begin(9600);
}

void getOrientation() {
  frontSense = 0;
  backSense = 0;
  orientation = 0;
 for (int i = 0; i < 10; i++) {
  frontSense = analogRead(IRFront) + frontSense;
  backSense = analogRead(IRBack) + backSense;
  if (i == 9) {
   frontSense = frontSense / 10;
   backSense = backSense / 10;
   orientation = frontSense - backSense;
  }
 }
}

void loop() {
getOrientation();

float delta = orientation / 8;
if(delta > 90) delta = 90;
if(delta < -90) delta = -90;
if(orientation > 250) fall = fall + 1;
if(orientation < -250) fall = fall - 1;
left.write(81 - delta);
right.write(81 + delta);
if (fall == 25 || fall == -25) {
   left.write(servoZero);
   right.write(servoZero);
   delay(250);
   fall = 0;
}
Serial.print(orientation);
Serial.print("   ");
Serial.println(fall);
}

Video dimostrazione:

 

js-linux-avvio

Emulatore Shell Linux online con javascript

0

Qualche giorno fa girando su internet ho trovato un articolo che narrava le imprese di un famoso hacker francese. Questa persona ha creato un programmino in javascript che è in grado di emulare la classica shell di ogni sistema operativo linux, con tutti i suoi comandi. Andando sulla pagina del suon sito infatti ci troviamo davanti ad un vero e proprio terminale unix.

Questo è il suo sito http://bellard.org/jslinux/

 

 

 

 

 

 

 

 

circuito

Sensori di luce con un semplice led e Arduino

3

Alcuni giorni fa navigando su internet ho trovato un interessante guida su come trasformare un semplice led in una sorta di fotoresistenza, ovvero un sensore bipolo all’interno del quale la tensione varia in base alla quantità di luce che lo colpisce.

Per far si che ciò avvenga ho collegato il led ad Arduino il quale elabora il segnale e in base ai comandi che noi inseriamo è in grado di fare moltissime cose.

In questo piccolo esempio ho ricreato un circuito che fa accendere 6 led in serie solo quando fuori è buio e quindi la luce che entra nel led usato come sensore è quasi pari a zero.

 

Schema circuito:

esempio:

 

Quello da solo in basso a sinistra è il led che ho usato come sensore ed è collegato con il positivo sul pin 3.3V e il negativo sull’ingresso analogico A0. I 6 led in serie invece sono collegati con il polo negativo al gnd e quello positivo pin 9.

 

codice usato in Arduino:

const int led =  9;

void setup() {
  Serial.begin(9600);

}

void loop() {
 int x = analogRead(A0);
 Serial.println(x);
 if (x > 515) {   // 515 è il valore stampato sul seriale quando fuori non c'è luce

   analogWrite(led, 255);
 }
 else {

   analogWrite(led, 0);

 }
}

video dimostrazione (clicca il link per vederlo)

IMG149

“Da vinci” un robot basato su Arduino e led ir

0

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);

    }
  }
Giacomo Furia's RSS Feed
Torna all'inizio