Gambas-it

Gambas3 => Programmazione => Topic aperto da: biggsman - 23 Ottobre 2013, 14:37:55

Titolo: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 23 Ottobre 2013, 14:37:55
Buongiorno amici!

Ho acquistato Arduini Uno e con un pò di delusione ho visto che posso leggere i dati degli ingressi analogici
dal monitor seriale..
cercando qua e la ho trovato varie soluzioni in C++ (ma non ci capisco un H++...)
in Visual Basic che però funziona su xp ma non ne voglio più sapere..
Ho trovato su questo forum
http://www.gambas-it.org/smf/index.php?topic=2485.msg26660;topicseen#msg26660

compersi
* leggi_ingressi-3.0.tar.gz

* lettura_ingressi_analogici.zip
che ho installato e funzionano. :D
ora vorrei un plot grafico che mi disegni ogni secondo il valore preso dal pin A1


tipo:
dato = valore preso da A1
punto (valore di x , dato)
valore di x = valore di x +1
Sembra facile e in Vb lo saprei fare ma modificando così:

Codice: [Seleziona]
Public Sub SPort_Read()
  Dim s, $s As String
  Dim i As Integer
  Dim incr As Integer
 
    Read #Sport, s, Lof(Sport)
   
   
    s = Replace(s, "\r\n", "")
    s = Replace(s, "\n", "")
    s = Replace(s, "\r", "")
    Print s
  For i = 1 To Len(s)
    $s = Mid(s, i, 1)
   
    If $s = "#" Then
      sbuf = ""
    Else If $s = "!" Then
     
      textbox1.text = sbuf
      analizza(sbuf)
     
     


incr = incr + 1

    Else
      sbuf &= $s
    Endif
  Next

  Catch
  Timer1.Stop
  Wait 0.1
  connetti
   
  Draw.Begin(DrawingArea1)
   Draw.point(100 + incr, 100)
    Draw.End
 
End

non vedo risultati.. ???

Sono certo che è semplice e col vostro aiuto funzionerà!


Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 23 Ottobre 2013, 15:23:48
Ho impostato Drawingarea1 cached = true
e modificato:


Codice: [Seleziona]
Public Sub SPort_Read()
  Dim s, $s As String
  Dim i As Integer
 ' Dim incr As Integer
  Dim valore As Integer
 
    Read #Sport, s, Lof(Sport)
   
   
    s = Replace(s, "\r\n", "")
    s = Replace(s, "\n", "")
    s = Replace(s, "\r", "")
    Print s
  For i = 1 To Len(s)
    $s = Mid(s, i, 1)
   
    If $s = "#" Then
      sbuf = ""
    Else If $s = "!" Then
     
      textbox1.text = sbuf
      analizza(sbuf)
       Dial1.Value = (sbuf / 10)
       valore = sbuf
         Draw.Begin(DrawingArea1)
    Draw.Fillcolor = 1000
    Draw.point(incr, valore)
    Print incr
    Draw.End
    incr = incr + 1
     
    Else
      sbuf &= $s
    Endif
  Next
   

  Catch
  Timer1.Stop
  Wait 0.1
  connetti
 
 
End

ora funziona!

Grazie mille a fsurfing per i files! :D
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 23 Ottobre 2013, 16:56:47
Bene! e adesso cerchiamo il modo di accendere un pin out con gambas3..  :rolleyes:
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: Top Fuel - 23 Ottobre 2013, 18:28:45
Non ho mai usato Arduino ma se si tratta di leggere in maniera seriale suppongo che per scrivere si debba aprire la porta seriale corrispondente e mandare i dati.
Nell'altro thread si apre la seriale in questa maniera:

Codice: [Seleziona]
hFile = OPEN "/dev/ttyS0" FOR READ WRITE WATCH

Così dovrebbe essere aperta sia in lettura che in scrittura.
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: vuott - 23 Ottobre 2013, 18:41:28
Codice: [Seleziona]
hFile = OPEN "/dev/ttyS0" FOR READ WRITE WATCH

Così dovrebbe essere aperta sia in lettura che in scrittura.

Il file-device "/dev/ttyS0" potrebbe essere protetto, e quindi in quel momento inaccessibile.   :-\
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: Top Fuel - 23 Ottobre 2013, 18:48:36
Ma così suppongo che non sia accessibile neppure in lettura. O sbaglio?
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 23 Ottobre 2013, 19:44:33
Mah.. ho imparato che aprendo con $ sudo gambas3 si possono fare più cose...
funziona, non chiedetemi perchè.. :-\
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 23 Ottobre 2013, 19:56:59
Comunque, da quello che ho capito bisogna fare uno scketch che contiene tutte le istruzioni che servono poi fare l' upload sull' Arduino e poi interrogare o inviare delle robe
sarebbe bello quindi che sullo sketch ci fossero tutte le istruzioni per
-Leggere i pin analogici
-Leggere i pin digitali
-Scrivere i pin digitali
e poi bisognerebbe capire come gestire il tutto da gambas3 (che a me piace più rispetto ad altri linguaggi  ;) )
Così si potrebbe gestire con delle belle interfacce, con slider, grafici etc
Un pò quello che si riusciva a fare con vbio.dll e la lpt1 e un vecchio adc8004..
Il tempo passa e i mezzi diventano più potenti (ma forse anche più complessi) ma se ci proviamo insieme troveremo il modo..
Ci state?

 :ok:
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: fsurfing - 23 Ottobre 2013, 22:47:24
in realta è tutto molto semplice, volendo si può utilizzare la comunicazione seriale per inviare e ricevere dati da/a arduino

per intenderci solitamente la porta di comunicazione è /dev/ttyACM0

per la comunicazione seriale l' esempio serialport di gambas3 è ottimo per iniziare e per essere modificato a nostro comodo

piccolo esempio:
Codice: [Seleziona]
int RELE =11;
 
  int i = 0;
  int inByte = 0;
  int ngocce=0;
  int tempo=0;
  int ritardo=0;
  String ricevuto="";
  boolean completo= false;
 
 
 
  void setup()
  {
   
    pinMode( RELE, OUTPUT);
    Serial.begin(19200);
    ricevuto.reserve(100);
   
  }
 
  void loop(){

        // print the string when a newline arrives:
      if (completo==true) {
        ngocce=(ricevuto.substring(0,4).toInt());
        tempo=(ricevuto.substring(5,8).toInt());
        ritardo=(ricevuto.substring(9,12).toInt());
        //Serial.println(ngocce);
        //Serial.println(tempo);
        //Serial.println(ritardo);
       
        for (i=1 ; i< (ngocce+1); i++){
         
          digitalWrite(RELE,1);
          delay(tempo);
          digitalWrite(RELE,0);
          delay(ritardo);
          //Serial.println(i);
        }
        // clear the string:
        ricevuto = "";
        completo = false;
        //Serial.println(completo);
        Serial.println("ok");
      }
     
    }
 

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    ricevuto += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      completo = true;
    }
  }
}





lo sketch riceve una strinca formata da 3 numeri di 4 cifre che indicano il numero di impulsi la durata dell' impulso e il tempo di pausa tra gli impulsi

quindi sulla seriale basterà spedire una stringa di questo tipo

000505000200

per avere 5 impulsi di 500ms con una pausa di 200 ms tra uno e l' altro


ps: non sono un esperto di programmazione simil c , quindi il codice potrebbe esserere migliorabile
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 24 Ottobre 2013, 12:18:24
ok!
Questo funziona! ho difficoltà però a capire come..
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 24 Ottobre 2013, 19:08:05
lo credevo più facile...
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: fsurfing - 24 Ottobre 2013, 20:10:09
non è difficile

Codice: [Seleziona]
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    ricevuto += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      completo = true;
    }
  }
}

questa funzione non fa altro che ricevere tutti i char che arrivano sulla seriale e metterli uno dopo l' altro nella stringa "ricevuto"
quando arriva il carattere di ritorno a capo "\n" (quando invii la stringa con gambas automaticamente viene terminata con un carattere di ritorno), la variabile completo passa a true, quindi interviene la funzione principale main loop
Codice: [Seleziona]
void loop(){

        // print the string when a newline arrives:
      if (completo==true) {
        ngocce=(ricevuto.substring(0,4).toInt());
        tempo=(ricevuto.substring(5,8).toInt());
        ritardo=(ricevuto.substring(9,12).toInt());
        //Serial.println(ngocce);
        //Serial.println(tempo);
        //Serial.println(ritardo);
       
        for (i=1 ; i< (ngocce+1); i++){
         
          digitalWrite(RELE,1);
          delay(tempo);
          digitalWrite(RELE,0);
          delay(ritardo);
          //Serial.println(i);
        }
        // clear the string:
        ricevuto = "";
        completo = false;
        //Serial.println(completo);
        Serial.println("ok");
      }
     
    }
 

infatti il codice del loop non viene mai eseguito se completo non è = a true  (primo if)

essendo la stringa ricevuto completa l' if viene eseguito

per cui io ho estratto dalla stringa ricevuta le 4 sotto stringhe di 4 caratteri che indicano i tempi , e nella stessa riga di codice le converto in integer

a questo punto nelle tre variabili  gogge , tempo e ritardo ho i 3 valori in millisecondi che mi servono a far lampeggiare il pin 11

questo viene fatto dal ciclo for  che in  pratica loopa per un tot di volte a seconda del valore di "gocce"

per ogni ciclo viene posto a 1 il pin , per  il tempo indicato da "tempo"  (1° delay)
poi il pin vine posto a 0
poi il secondo delay aspetta per il tempo impostato da ritardo e quindi il ciclo si ripete

finiti tutti i cicli la variabile ricevuto viene svuotata
e completo posto a false, così il programma è pronto a ricevere nuove stringhe.


questo è solo un esempio che è stato realizzato in questo modo perchè a me serviva così , ma come in tutti i linguaggi ci sono svariati altri modi per ottenere il risultato voluto

cmq Serial.read()  legge la seriale

Serial.println invia sulla seriale qualsiasi tipo di dato
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 24 Ottobre 2013, 21:08:32
Aspita che spigazione!
Grazie per il lavorone, davvero!
Ora mi son chiare altre cose che potrò studiare...
Forse son troppo legato al concetto delle sub e function...
 :2birre:
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 24 Ottobre 2013, 21:27:14
Hummm...
la stringa è ciò che scambia Gambas con il processore Arduino.. e viceversa..
quindi nonscrive su una porta  o un indirizzo...
1 e 0 non sono quindi valori binari ma dei caratteri ascii...  :coder:
Intravedo una schiarita!
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: fsurfing - 24 Ottobre 2013, 21:59:41
Questo e solo un metodo che ho usato io, sicuramente ve ne sono altri.....
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 26 Ottobre 2013, 08:01:14
modificando lo sketch son riuscito a produrre un segnale (Dir e Step) per pilotare uno stepper!
 :D
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 26 Ottobre 2013, 17:09:28
con un po' di fatica e il vostro aiuto son riuscito a scrivere un programma che mi permette di far girare uno stepper
nei due sensi di quantogli dico da Pc
 :D
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: vuott - 26 Ottobre 2013, 17:26:41
Spero che tu voglia riportare, ancorché brevemente, il tuo studio su quest'argomento, affinché possa essere utile anche ad altri in futuro, all'interno della nostra WIKI.
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 26 Ottobre 2013, 17:43:21
ok ma prima devo migliorare (pulire) ciò che ho scritto e magari commentarlo..
meglio vero?
 :coder:
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: vuott - 26 Ottobre 2013, 19:47:47
ok ma prima devo migliorare...

Fai con comodo.  :ciao:
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 02 Novembre 2013, 10:43:21
Avrei pronti i files da scaricare ma uno è la modifica di Serial_port in dotazione con gli esempi..
Credo si possa distibuire su questo forum ma vorrei fosse un moderatore  a confermare prima di farlo.
 :-\
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: vuott - 02 Novembre 2013, 16:57:56
Avrei pronti i files da scaricare ma uno è la modifica di Serial_port in dotazione con gli esempi..
Credo si possa distibuire su questo forum ma vorrei fosse un moderatore  a confermare prima di farlo.


Ma sono dei file applicativi (insomma degli applicativi dimostrativi), oppure dei file di testo da inserire nella WIKI per creare lì un'apposta pagina ?


Nel primo caso (applicativi demo) puoi allegarli qui liberamente, come facciamo tutti.  :-\

Nel secondo caso (testo per creare un'apposita pagina nella WIKI) puoi chiedere ad un Amministratore di essere ammesso a scrivere nella WIKI, oppure affidi quei file di testo ad un membro già accreditato per l'accesso in scrittura nella WIKI.
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 02 Novembre 2013, 19:01:00
 :-[ ehmm non sono esperto..
posterei qui il file .ino per Arduino e il file .zip del progetto per la wiki casomai si vede in seguito magari dopo aver ancora migliorato... ;)
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 04 Novembre 2013, 06:26:21
Quindi? procediamo? :-\
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: Top Fuel - 04 Novembre 2013, 12:09:34
Procedi... :)
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 04 Novembre 2013, 22:14:13
Ecco qua:
il file .ino è quello di fsurfing  modificato..
Lo zip contiene il progetto ottenuto modificando serial port in dotazione..
Funziona con arduino uno..
dopo aver aperto la porta "open"
sulla destra si può impostare
il numero degli step
La durata dell' impulso ed il tempo di pausa tra l' uno e l' altro..
Questo ha uno scopo sperimentale e didattico, ed è fornito così com'è sul mio pc funziona
Usate con cautela e a vostro rischio..ovviamente non rispondo di eventuali danneggiamenti.. ;)
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 04 Novembre 2013, 22:32:05
no riesco ad allegare e allora copiaeincolla
...
Codice: [Seleziona]
// il seguente codice deriva da quello scritto da fsurfing

  int i = 0;
  int inByte = 0;
 
  int passi=0;
  int tempo_h=0;
  int tempo_l=0;
  int direzione=0;
 
  String ricevuto="";
  boolean completo= false;
     
 
 
  void setup()
  {
    // pin2 per gli step pin3 per direzione
     pinMode( 2, OUTPUT);
     pinMode( 3, OUTPUT);
               
   
    Serial.begin(19200);
    ricevuto.reserve(100);
   
   
  }
 
  void loop(){
           

        if (completo==true) {
        // estraiamo i dati dalla stringa che abbiamo passato
        passi=(ricevuto.substring(0,4).toInt());
        tempo_h=(ricevuto.substring(5,8).toInt());
        tempo_l=(ricevuto.substring(9,12).toInt());
        direzione=(ricevuto.substring(12).toInt());

       // diamo un senso di rorazione
         digitalWrite(3,direzione);
       // azzera
          digitalWrite(2,0);
       
         for (i=1 ; i< (passi+1); i++){
       
         
          // step! la durata dipende dall hardware
          digitalWrite(2,1);
          delayMicroseconds(tempo_h);
          // quanto tempo voglio par passare prima del prossimo step?
          digitalWrite(2,0);
          delayMicroseconds(tempo_l);
     
         
          //Serial.println(i);
        }
     
       
        // clear the string:
        ricevuto = "";
        completo = false;
        Serial.println("ok");
      }
     
    }
 

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    ricevuto += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      completo = true;
   
    }
  }
}
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: vuott - 04 Novembre 2013, 23:05:25
Ecco qua:


Molto bene. Grazie dell'apporto.
Titolo: Re: Gambas3 + Arduino e plot dei dati..
Inserito da: biggsman - 05 Novembre 2013, 06:06:03
 :D