Autore Topic: Gambas3 + Arduino e plot dei dati..  (Letto 2065 volte)

Offline biggsman

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
Gambas3 + Arduino e plot dei dati..
« il: 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à!



Offline biggsman

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #1 il: 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

Offline biggsman

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #2 il: 23 Ottobre 2013, 16:56:47 »
Bene! e adesso cerchiamo il modo di accendere un pin out con gambas3..  :rolleyes:

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #3 il: 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.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #4 il: 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.   :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #5 il: 23 Ottobre 2013, 18:48:36 »
Ma così suppongo che non sia accessibile neppure in lettura. O sbaglio?
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline biggsman

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #6 il: 23 Ottobre 2013, 19:44:33 »
Mah.. ho imparato che aprendo con $ sudo gambas3 si possono fare più cose...
funziona, non chiedetemi perchè.. :-\

Offline biggsman

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #7 il: 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:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #8 il: 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

Offline biggsman

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #9 il: 24 Ottobre 2013, 12:18:24 »
ok!
Questo funziona! ho difficoltà però a capire come..

Offline biggsman

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #10 il: 24 Ottobre 2013, 19:08:05 »
lo credevo più facile...

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #11 il: 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

Offline biggsman

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #12 il: 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:

Offline biggsman

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #13 il: 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!

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Gambas3 + Arduino e plot dei dati..
« Risposta #14 il: 24 Ottobre 2013, 21:59:41 »
Questo e solo un metodo che ho usato io, sicuramente ve ne sono altri.....