controllo da pc

ciao ... vorrei utilizzare arduino come controllo e comando di motori ma per problemi di calcolo vorrei tenere il comando dai motori .. preferibilmente in vb; sostanzialmente comandare i digital pin in output e leggere i valori analogici direttamente da pc.. avevo visto il software firmata in vb e pensavo modificabile a piacere, purtroppo ho acquistato un "mega" e con i strumenti firmata nn posso comandare i pin > de 12
mi potete aiutare

Puoi comandare il tuo arduino via seriale tramite qualsiasi linguaggio di programmazione! Fede

cio fede ho fatto una piccola prova e lo pubblicata:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1253609992

con alcune piccole modifichette funziona .. mando un carattere "acii" (!= 33) da pc e lui mi accende il pin (led) che voglio .. ok ..
tre piccole domande ...
è possibile inviare il dato di accensione del pin direttamente senza dover programmare il modulo?
è possibile far leggere alla seriale dati nn ascii e più caratteri?
è possibile inviare il programma senza passare per il toll di programazione, e in che modo?

GRAZIE

Ciao, vediamo se riesco a darti qualche consiglio...
La prima cosa, che e' certa, e' che per far fare qualche cosa ad arduino e al suo chip atmega devi programmarlo. La maniera che io utilizzo (ma credo non ve ne siano altre) per ricevere i dati dal pc e generare eventi e' quella di creare una serie di casi che puoi ricevere in entrata e gestirli.

Puoi inviare caratteri ascii attraverso la seriale, e puoi inviarne un certo numero, non sei limitato a uno. Puoi inviare questi dati sia da un programma che scrivi tu, sia utilizzando chiamate alla seriale direttamente da qualche altro software che la utilizzi. minicom sotto linux, terminal sotto windows, oppure ancora roba tipo questo
http://todbot.com/blog/2006/12/06/arduino-serial-c-code-to-talk-to-arduino/

Ti allego un codice che ho scritto per comandare alcuni rele', dove accetta in entrata piu' parametri. Non ho il tempo ora di spiegarlo punto punto ma e' un po' commentato e magari puo' gia' esserti di aiuto

/*
 * Accensione RME e Amplificatori
 * Per accendere gli amplificatori inviare "s 0 1" e per spegnerli "s 0 0"
 * Per accendere la scheda audio inviare "s 1 1" e per spegnerli "s 1 0"
 * Connettere i rele' per gli ampli al pin 3 e quello per la scheda audio al 2
 */

int relayPinRME = 2;     // RME Relay is connected to pin 2
int relayPinAMP = 3;     // AMP Relay is connected to pin 3
char AMP='0'; // Ho messo il carattere 0 e non il valore 0
char RME='1'; // Attenzione alla differenza tra caratteri e interi!
char val;

void setup() {
  pinMode(relayPinRME, OUTPUT);    // Set the RME pin as output
  pinMode(relayPinAMP, OUTPUT);    // Set the AMP pin as output
  Serial.begin(9600);
}

void loop() {
  
  if (Serial.available()>=5) {
    char cmd,apparato,stato;
    
    cmd=Serial.read();Serial.read();
    apparato=Serial.read();Serial.read();
    stato=Serial.read();
    
    // esegue le operazioni indicate
    if (apparato == AMP && stato=='0'){
       digitalWrite(relayPinAMP, LOW);
       Serial.println("Spengo Amplificatori..."); 
    }
    else if (apparato == AMP && stato=='1'){
       digitalWrite(relayPinAMP, HIGH);
       Serial.println("Accendo Amplificatori...");
    }
    else if (apparato == RME && stato=='0'){
       digitalWrite(relayPinRME, LOW);
       Serial.println("Spengo Rme...");
    }
    else if (apparato == RME && stato=='1'){
       digitalWrite(relayPinRME, HIGH);
       Serial.println("Accendo Rme...");
    }
  
  }
  
}

Se posso darti un consiglio puoi provare anche due "moduli esterni" di programmazione molto interessanti:

e

Sono due metodi per caricare uno sketch statico sull'arduino e mandargli dei comandi dal PC.
Arduino compierà le azioni che gli raccomandi ;D
Secondo me vale la pena spenderci un po' di tempo per comprenderne il funzionamento.

si si .. Grazie il mio è molto simile :

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop()
{
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
int ledPin1 = Serial.read();
digitalWrite(ledPin, LOW); // set the LED off
ledPin= ledPin1-33; //change the Led since 0
pinMode(ledPin, OUTPUT);
Serial.print("I received: ");
Serial.println(ledPin, DEC);

}
//say what you got:

digitalWrite(ledPin, HIGH); // set the LED on
//delay(1000); // wait for a second
//digitalWrite(ledPin, LOW); // set the LED off
//delay(1000); // wait for a second

}

modificando degli esempi .. e ho capito anche il Mio errore nel buffer seriale... (progammo in vb e in C ho pochissima esperienza)
poi con una serie di "if" o "case" faccio quello che voglio .. GRAZIE...
altra cosina .. è possibile inviare il programma nn utilizzando i tool... esempio via seriale ... ogni volta che accendo il programma esterno in pc? GRAZIE.. lo so che rompo

void setup() {
  // initialize serial communication:
  Serial.begin(115200); 
   // initialize the LED pins:
      pinMode(22, OUTPUT);
      pinMode(23, OUTPUT);
}

void loop() {
  // read the sensor:
  if (Serial.available() > 0) {
    int inByte = Serial.read();
    // do something different depending on the character received.  
    // The switch statement expects single number values for each case;
    // in this exmaple, though, you're using single quotes to tell
    // the controller to get the ASCII value for the character.  For 
    // example 'a' = 97, 'b' = 98, and so forth:

    switch (inByte) {
    case 'a':    
      digitalWrite(22, HIGH);
      
      if (digitalRead(23) ) {
        digitalWrite(23, LOW);
      } 
      
      Serial.print("I received 1: ");
      Serial.println(inByte, DEC);
      Serial.print("sensor: ");
      Serial.println(analogRead(0), DEC); 
      break;
      
    case 'b':    
      digitalWrite(23, HIGH);
      
      if (digitalRead(22) ) {
        digitalWrite(22, LOW);
      } 
      
      Serial.print("I received 1: ");
      Serial.println(inByte, DEC);
      Serial.print("sensor: ");
      Serial.println(analogRead(0), DEC); 
       break;
   
    case 'c':    
      digitalWrite(22, HIGH);
      digitalWrite(23, HIGH);
      Serial.print("I received 1: ");
      Serial.println(inByte, DEC);
      Serial.print("sensor: ");
      Serial.println(analogRead(0), DEC); 
       break;
    
    case 'd' :
      digitalWrite(22, LOW);
      digitalWrite(23, LOW);
      Serial.print("I received 1: ");
      Serial.println(inByte, DEC);
      Serial.print("sensor: ");
      Serial.println(analogRead(0), DEC); 
       break;
     
    } 
    
  }
}

mi sembra carino e seplice :slight_smile: