Pages: 1 ... 8 9 [10]   Go Down
Author Topic: Semplice rete neurale per Arduino 2  (Read 14236 times)
0 Members and 1 Guest are viewing this topic.
Rome/Italy
Offline Offline
Newbie
*
Karma: 1
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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  smiley.
Appena faccio passi avanti aggiorno il forum.
ciao a tutti
Logged

Offline Offline
Sr. Member
****
Karma: 4
Posts: 378
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 4
Posts: 378
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho un problema con questo sketch:
Code:
#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:
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.
« Last Edit: July 11, 2013, 07:17:37 am by yoshi93 » Logged

0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10508
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mostraci getFloat()
Logged

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

Offline Offline
Sr. Member
****
Karma: 4
Posts: 378
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

È nei file allegati comunque:
Code:
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;
}
Logged

0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10508
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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

ho risolato facendo da

Code:
unsigned char inbox[4];

a

Code:
unsigned long inbox[4];

poi io consiglierei, visto che le parentesi sono gratis, di scrivere:
Code:
float member = *((float *)&d);
Logged

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

Offline Offline
Sr. Member
****
Karma: 4
Posts: 378
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Strano,questa mi sfuggiva  smiley. 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.
« Last Edit: July 11, 2013, 07:22:20 am by yoshi93 » Logged

Offline Offline
Sr. Member
****
Karma: 4
Posts: 378
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: 1 ... 8 9 [10]   Go Up
Jump to: