aiuto codice robot

ciao a a tutti. Sto cercando di fare in modo che il mio robot dopo tot tempo cambi stato e da fermo parta, se un valore raggiunge un certo valore il robot deve fermarmi di nuovo.

io ho scritto: unsigned long time; time = millis(), if (time > 5000) { start(); }

e funziona ma non so come azzerare in modo corretto il contatore e riportare il robot in stasi.

Qual'è la funzione migliore da richiamare per non fare girare i servi (continui) a 45?? io ho scritto: void standFor() { left.write(90); left.write(90); } che richiamo con un boolean.

mannaggia, mi ripropongo sempre di scrivere un piccolo tutorial per il millis ma poi non ho mai voglia :stuck_out_tongue:
E’ ovvio che non si fermi mai:

unsigned long time;
void setup(){
  time = millis();
}

void loop(){
 time=millis();

  if (time < 5000+millis()) {
    start();
}

E’ da testare ma dovrebbe essere così.
Devi invertire il segno e comparare 5000 con l’aggiunta di millis.
Tieni conto che lo start quindi avverrà ogni 5 secondi: sicuro che sia quello che vuoi?

fallo, ti prego!

beh appena capisco bene il funzionamento proporro’ di certo il tutorial.
Allora… io vorrei fare un sistema che quando richiamato azzeri il timer e richiami una funzione dopo tot tempo

ecco un’idea:

if (time < 10000) {
start();
}

if (encounters == 5) {
time = 0
}

cioè dopo 10 sec parti dopo che avrai incontrato 5 ostacoli ferma e rimani in standby per 10 sec e riinizia il loop

Sono riuscito a scrivere il codice che dicevo. Per ora è davvero semplice.
C’è un solo ir che avvisa se ci sono oggetti. Ho inserito la funzione di accelerazione e decelerazione per i servi, ora stavo cercando ci capire come funziona lo smoothing, qualcuno ha qualche res in merito (a parte l’esempio in learning)?
Ho un problema, la randomizzazione non funziona. Curva sempre a destra, come mai??? ecco il codice!!!

Piano piano lo commento tutto, magari puo’ essere utile!!

#include <Servo.h>

int stdledPin = 13;             // choose the pin for the LED
int irFrontPin = 0;              // choose the ir sensor input pin
int irFrontval = 0;             // variable for reading the ir pin data
boolean standBy = true;        // standby mode
boolean moveForward = false;     // forward mode
boolean targetFront = false;   // target on the front 
boolean targetBack = false;           // target behind
boolean moveBackward = false;      //moving backward
int encounters = 0;                    // ecounters with something
unsigned long randomizer;                 // trying to randomize (it seems don't working)
Servo left;                                   // attaching servos
Servo right;                                  ///////////////////
long time = 0;                                // last start time 
long interval = 5500;                        // time of stand by mode


void setup() {
  pinMode(irFrontPin, INPUT);         // declare ir as input
  left.attach(10);                    // servos
  right.attach(11);                   /////////
  Serial.begin(9600);                 // serial communication @ 9600 baud
  randomSeed(analogRead(1));          // randomSeed from analog port 1 
}

void accelerate() {
 moveForward = true;
 standBy = false;
 targetFront = false;
 int throttle = 0.001;
  for (standBy = false; throttle < 90; throttle++) {
    delay(50);
    irFrontval = analogRead(irFrontPin); 
    Serial.print(irFrontval);
     if (irFrontval > 250) { 
      encounters++;
      flip();
      break;
    }
   left.write(89 + throttle);  //from standby position add every cycle 0.1 (the servo start to go backward)
   right.write(90 - throttle); //from standby position substract every cycle 0.1 (the servo start to go backward)
    if (throttle == 89) {
      servocontinue();
      break;
    }
  }
}

void flip() {
  moveBackward = true;
  randomizer == random(0,1);
  if (randomizer == 1) {
   decelerate();
   moveBackward = false;
   left.write(180);
   right.write(180);
   delay(500);
   targetFront = false;
  } 
  if (randomizer == 0) {
   decelerate();
   moveBackward = false;
   left.write(0);
   right.write(0);
   delay(500);
   targetFront = false;
   }
 }
 
 void decelerate() {
   int z = 1;
   for (moveBackward = true; z < 90; z++) {
     delay(1);
     left.write(180 - z);
     right.write(0 + z);
     if (z == 89) {
       moveBackward = false;
       targetFront = true;
       standFor();
       break;
     }
   }
 }
   
  void standFor() {    // standby mode (no movements)
  left.write(90);       // stop servoleft
  right.write(90);       // stop servoright
  standBy = true;         // we are in standby
  if (encounters < 5) {
    if (moveForward == true) {
      if (targetFront == false) {
         servocontinue();
      }
    }
   } if (encounters > 5) {
      standBy = true;
      moveForward = false;
   } 
  }
  
  void servocontinue() {
    targetFront = false;
    standBy = false;
    moveForward = true;
    left.write(180);
    right.write(0);
    irFrontval = analogRead(irFrontPin); 
    if (irFrontval < 250) {
      servocontinue();
   } else {
     encounters++;
     flip();
     standFor(); 
   }
  }
  
  void loop() {
  if (standBy = true) {  
    standFor();
   if (millis() - time > interval) {
     time = millis();
     interval = random(5500,15000);
     encounters = 0;
     accelerate();
    }
  }
  if (standBy = false) {
    if (targetFront = false) {
      servocontinue();
    }
  }
}

Ciao prima una domanda: ma usi dei servi modificati per la rotazione continua? In tal caso la modifica l'hai fatta tu? Come? Per quanto riguarda l'accellerazione a destra penso dipenda da queste istruzioni nella funzione accellerate:

   left.write(89 + throttle);  //from standby position add every cycle 0.1 (the servo start to go backward)
   right.write(90 - throttle); //from standby position substract every cycle 0.1 (the servo start to go backward)
    if (throttle == 89) {

Questo effettivamente ha un senso. Se vuoi che random giri a dx o sx puoi sostituire quelle istruzioni come segue (sono da testare quindi non assicuro il risultato :-) )

if(interval > 10250){  //10250 valore intermedio tra 5500 e 15000
   left.write(89 + throttle);
   right.write(90 - throttle);
}
else{
   right.write(89 + throttle);
   left.write(90 - throttle);
}

Prova e facci sapere ;)

Ciao per trasformare in rotazione continua un servo normale basta: arprire il gearbox e rintracciare lo stopper sull'ingranaggio che blocca il moto, smontare l'ingranaggio ed eliminare con un taglierino lo stopper, in secondo luogo al di sotto della sede dell'ingranaggio ci dovrebbe essere un potenziometro che sente la rotazione, basta asportarlo e fare un piccolo buco nella cassa del nostro servo e inserirlo all'interno, in modo da poterlo regolare. Rimontando tutto tramite il potenziometro si potra' tarare la posizione di partenza del servo, (che andra' settata su fermo) il valore fermo in codice è 90 poi dipende da come è montato il servo 180 è avanti tutta 0 indietro tutta.

per la sterzata a destra il problema era che richiamavo questa funzione:

void flip() {
  moveBackward = true;
  randomizer == random(0,1);
  if (randomizer == 1) {

qui c'è l'errore cioè se random(0,1) restituira' sempre 0 perchè il minimo cioè 0 è incluso invece il massimo è escluso e quindi il robot girava sempre in una direzione e mai nell'altra.

su i servi a rotazione continua essendo montati in modo opposto è normale dare due valori opposti per ottenere una accelerazione rettilinea.

Ora il mio problema è lo smoothing dei valori dei sensori, mi date una mano?

ecco il video dei primi test: http://www.youtube.com/watch?v=My_F8sGu9Ac

posso farti alcune domande tecniche? utilizzi dei motoriduttori? la parte in plexy l'hai tagliata tu? fede

utilizzo due semplici servi a rotazione continua parallax (puoi trasformare qualsiasi servo in rotazione continua) scrivi su google continuous rotazion servo hacking o modding...

il plexi l'avevo comprato da www.oomlout.com ma non è piu' in vendita il kit che avevo preso io. Adesso sto montando la mia macchina cnc a taglio laser poi se avete bisogno basta chiedere.

Innanzitutto complimenti, io avevo pensato di tagliare il plexi con un cutter, penso che forme abbastanza semplici siano realizzabili, le ruote le acquisterei direttamente solo che sono indeciso su come montare la terza in modo che sia alla stessa altezza delle altre, oomlut vendeva il kit di montaggio di plexiglass? potrei sapere quanto l'hai pagato e che spessore ha? puoi postare qualche foto della macchina senza il netbook sopra? Grazie Francesco.

Il servo a rotazione continua e' simile a un motore dc? Che tipo di vantaggio ho? Ho maggiore potenza e minore velocità?

Dove abiti tu, e la tua macchina al taglio laser? :)

Fede

Ciao, girovagando in rete, ho trovato il progetto di costruzione del tuo robot, mi chiedevo se fosse possibile, eventualmente, realizzarlo con la tua macchina cnc a taglio laser, e a quanto ammonterebbe la spesa di realizzazione. Grazie Francesco

Fatemela finire mi sta arrivando il laser dall'america!! Appena ho finito con questo robot x chi si porta i materiali il taglio è gratuito. Allora ora sto cercando di creare una porta virtuale tra processing e roborealm, qualcuno di voi ha ida di come si fa?

in poche parole far comunicare serialmente roborealm con processing.

Pensavo di organizzare un piccolo workshop su arduino. Avrei lo spazio dove realizzarlo in zona Via Savona (milano), c'è qualcuno di interessato? Chiaramente dopo capodanno.

Io sono molto interessato. Credo sarebbe molto stimolante. Ciao Francesco. p.s. vorrei aiutarti, ma purtroppo non sono in grado.

Io interessato, abito in zona tibaldi percui sono anche vicino :) Nel merito invece non conosco roborealm, ho guardato il sito ma non ho capito bene a che serve :-[