Go Down

Topic: Semplice rete neurale per Arduino 2 (Read 15385 times) previous topic - next topic

ratzeni

@yoshi93
per quanto riguarda le funzioni carica pesi/salva pesi, vorrei provare ad utilizzare una micro SD.
Ho un SD socket sparkfun e sto studiando i consigli sul forum per riuscire a farla funzionare senza bruciare tutto  :).
Appena faccio passi avanti aggiorno il forum.
ciao a tutti

yoshi93

@ratzeni
prova pure, io non ti fermo  :). Appena finisco con gli esami mi rimetto al lavoro per completare le librerie python per la comunicazione seriale tramite byte.

yoshi93

#137
Jul 10, 2013, 06:13 pm Last Edit: Jul 11, 2013, 02:17 pm by yoshi93 Reason: 1
Ho un problema con questo sketch:
Code: [Select]

#include <ByteSerial.h>

int count=0;

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

void loop()
{
 float in=getFloat();
 Serial.println(in);
 Serial.flush();
}

che fa uso della libreria ByteSerial che trovate nel download.
L'output è:
Code: [Select]

223
3
22
70
0.00

dove al posto di 0.00 dovrei trovare 9600.968 . I valori prima sono i vari byte che compongono il dato e sono stampati dalla funzione getFloat() stessa come debug. Usando questo tool: http://www.h-schmidt.net/FloatConverter/ ho verificato che i valori sono corretti (70 equivale al byte più significativo) però allora perchè arduino fallisce nella conversione?
I valori sono contenuti in un array di unsigned char percui sono byte e quindi sono numerici a tutti gli effetti (70 non è ad esempio '70').

Faccio notare che per le prove sto usando arduino UNO.

lesto

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

yoshi93

È nei file allegati comunque:
Code: [Select]

float getFloat()
{
    unsigned long d;
    unsigned char inbox[4];
    for(int i=0;i<4;i++)
    {
        while(!Serial.available()){}
        inbox[i]=Serial.read();
    }
    for(int i=0;i<4;i++)
    {
        Serial.println(inbox[i]);
    }
    d=(inbox[3] << 24) | (inbox[2] << 16) | (inbox[1] << 8) | (inbox[0]);
    float member = *(float *)&d;
    return member;
}

lesto

allora, (inbox[3] << 24), ennsendo inbox[3] un byte viene autocastato ad INT, quindi diventa 0. lo stesso vale per (inbox[2] << 16).

Code: [Select]
(inbox[1] << 8) | (inbox[0])

danno 1111011111, ovvero 991... indovina cosa esce se provi a stampare d?

ho risolato facendo da

Code: [Select]
unsigned char inbox[4];

a

Code: [Select]
unsigned long inbox[4];

poi io consiglierei, visto che le parentesi sono gratis, di scrivere:
Code: [Select]
float member = *((float *)&d);
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

yoshi93

#141
Jul 10, 2013, 11:20 pm Last Edit: Jul 11, 2013, 02:22 pm by yoshi93 Reason: 1
Strano,questa mi sfuggiva  :). Grazie dell'aiuto comunque chissà quanto ci avrei messo per capire che veniva autocastato ad un int da 16 bit  :smiley-roll-sweat:.

EDIT: La byteSerial è finita e la potete trovare nel primo post. Supporta l'invio/ricezione di float e long int entrambi composti da 4 byte.

yoshi93

Piccola correzione:
Nel file python di dimostrazione va importata anche la libreria time con "import time" e poi va usato il metodo sleep() con 2 secondi (time.sleep(2)) subito dopo la creazione della connessione (dopo l'except per essere precisi). Io ho fatto le prove con il Serial Monitor aperto però se si vuole usare solo lo script senza aprire altro sono necessarie quelle due righe di codice per aspettare il reset dell'arduino (l'arduino si resetta quando si crea la porta). Scusate dell'inconveniente.

Il progetto entra nella fase 3 cioè quella relativa al tool vero e proprio di carivamento della rete.

Aspetto il feedback di qualcuno su quello fatto fino ad ora per eliminare eventuali bug della ByteSerial.

Go Up