home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


Nuovo progettino.
     
Autore Messaggio opzioni
FrancoGual



[pagine pubblicate]

postato il:
14.09.2020, alle ore 10:02
Nuovo progettino. 

Buongiorno.
Sto portando avanti un progettino, nulla di particolare, ma cercando in rete gli aiuti necessari ho imparato una cosa, la condivisione è ancora una cosa molto personale.
Inizialmente volevo realizzare un affarino, arduino e accessori, per visualizzare in auto, alcuni parametri interessanti del mezzo, attraverso il canbus, ormai presente su tutte le vetture, almeno dal 2003 in poi.
Pareva tutto semplice, ma in Italiano non c'è nulla e se c'è si COMPRA.
Quello che voglio realizzare è un display, semplice ed economico, tipo un 20X4 basato su 44780 o seriale.
Si impostano nel programma cosa vuoi visualizzare e lo monti sulla vettura, 4 FILI, + - e canbus.
Ho realizzato il ricevitore, 'sniffer' per il momento, ma se necessario diventa interattivo richiedendo il PID richiesto.
Ma non so bene scrivere un codice, incappo in errori e non sono il personaggio adatto a comprendere bene.
A breve, ora sono al lavoro, allego il codice in uso che al momento visualizza i dati ricevuti.
Ora, il mio problema è questo.
Devo estrarre dalle stringhe ricevute il dato necessrio, a volte devo fare dei calcoli per rendere il valore reale e poi inviarlo al display.
Magari a molti potrebbe sembrare una stupidata ma ho notato che è molto richiesto, specie tra giovani pasticciatori di auto.
Si potrebbe poi fare un bel progetto, completo, ITALIANO, magari al 1° livello per noi ed attirare un pò di iscritti.
Ovvio chiaro, ovvero se lo comprendo IO lo capiranno TUTTI.
Il mio materiale :
Arduin Nano
Breakout MCP2515
Display 4X20
Il tutto dovrebbe funzionare su quasi tutti i modelli di vetture, il protocollo su dati standard è sempre quello.
Che ve ne pare?
Grazie per la lettura.



Anche il viaggio più lungo inizia con un piccolo passo.
Si vis pacem, para bellum!!!
Mark Zuckerberg ha reso suoi schiavi milioni di persone senza che se ne rendessero conto. F.G.
<Avete vinto voi,ma almeno non riuscirete a considerarmi vostro complice> Da Mediterraneo.
Inferno,Canto III,verso 51 Virgilio dice.........
double_wrap




una ogni 100 livelli
una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
15.09.2020, alle ore 12:12
FrancoGual:
[CUT] Ora, il mio problema è questo. Devo estrarre dalle stringhe ricevute il dato necessrio, a volte devo fare dei calcoli per rendere il valore reale e poi inviarlo al display [CUT] .


per estrarre caratteri da una stringa il compilatore arduino offre parecchie funzioni gia' pronte, Qui trovi la documentazione
https://www.arduino.cc/reference/en/language/variables/data-…
https://www.arduino.cc/en/Tutorial/BuiltInExamples#strings

ad esempio questa funzione estrae una sottosctringa
myString.substring(from, to)
https://www.arduino.cc/reference/en/language/variables/data-…

Per passare da un valore sotto forma di stringa (serie di caratteri) ad un valore numerico (int, float, ecc) ci sono delle funzioni apposta gia' pronte

http://www.cplusplus.com/reference/cstdlib/atoi/
converte una stringa in un <int>

http://www.cplusplus.com/reference/cstdlib/atof/
converte una stringa in un <float> in virgola mobile

http://www.cplusplus.com/reference/cstdlib/atol/
converte una stringa in un <long>

Molte funzioni C++ sono gestite dal compilatore arduino anche se non sono documentate nella ide

ps. il tuo progetto e' molto interessante, aggiornaci sugli sviuluppi e magari posta lo sniffer!





"se peso cado, ma se cado non peso"
adamatj.altervista.org
FrancoGual



[pagine pubblicate]

postato il:
16.09.2020, alle ore 11:35
Grazie della risposta.
Sto iniziando con questo:
https://github.com/coryjfowler/MCP_CAN_lib/blob/master/examp…

Ovvio che non posso allegare il codice poicè gli apici mandano in crash il sistema

E' un codice preso negli esempi, una volta scaricato le librerie relative al MCP2515.
E mi funziona, vedo il traffico di dati, ma non so esattamente come compilare la mascheratura. E successivamente prelevare il dato.



Anche il viaggio più lungo inizia con un piccolo passo.
Si vis pacem, para bellum!!!
Mark Zuckerberg ha reso suoi schiavi milioni di persone senza che se ne rendessero conto. F.G.
<Avete vinto voi,ma almeno non riuscirete a considerarmi vostro complice> Da Mediterraneo.
Inferno,Canto III,verso 51 Virgilio dice.........
double_wrap




una ogni 100 livelli
una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
17.09.2020, alle ore 18:59
provo a dare una risposta, magari sbaglio e quelli bravi mi correggeranno.

Ad ogni lettura la libreria restituisce tre entita'(!)

CAN0.readMsgBuf(&rxId, &len, rxBuf);

1) rxID (unsigned long quindi 4 bites) che viene stampato in esadecimale
2) len (unsigned char quindi 1 bite) -> e' il numero di byte ricevuti nell'array
3) rxBuf -> (unsigned char) e' un array di bites che contiene fino ad 8 bites che poi vengono stampati in esadecimale

Ora servirebbe sapere cosa siano quegli 8 bites nell'array, se sono caratteri (un bit ciascuno), interi (due bytes assieme), ecc

Per estrarli uno alla volta dal'array basta fare
unsigned char pippo=rxBuf[0];
unsigned char pluto=rxBuf[1];
unsigned char topol=rxBuf[2];
ecc

poi vanno convertiti nel formato voluto, ad esempio se ci fossero DUE bytes affiancati (pippo =high_byte, plut0=low_byte) che formano un intero si puo' fare

int clarabella= (int)pippo*256+(int)pluto

pero' serve sapere cosa sono quegli 8 bytes!

Se ho fatto casino, abbi pazienza....



"se peso cado, ma se cado non peso"
adamatj.altervista.org
FrancoGual



[pagine pubblicate]

postato il:
18.09.2020, alle ore 16:41
Grazie sempre, oltretutto sei l'unico che mi risponde, chiarendomi sempre qualcosa.
Intanto ho provato numerosi altri sketch.. tutti una boiata...
Quindi insisto su questo, intanto ho aggiunto una scrittura su display,
Sono swempre a caccia di qualcuno che mi dica cosa sono appunto gli 8 bytes.

Essndo un vecchio rinco, ti faccio la domanda di pappa pronta.
Allego un pezzo di dati ricevuti.
Spiego con parole mie, oltre all'ID che mi dice chi sta parlando, gli 8 bytes indicano cosa sta succedendo.
Quindi immaginiamo che devo prendere SOLO il terzo byte e poi farci su dei calcoli.
 ID: 351ID:  Data: 1C 00 34 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 14 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 34 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 14 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 3C 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 1C 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 14 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 1C 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 3C 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 1C 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 3C 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 24 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 04 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 24 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 04 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 24 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 04 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 24 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 0C 10 00 00 00 00 
ID: 351ID:  Data: 1C 00 2C 10 00 00 00 00 
 

Considera che i dati sono veri ma della macchina chiusa, i dati appaiono quando apro la porta e non faccio null'altro.
Ma per imparare va benissimo.
Non so se sono stato comprensibile.



Anche il viaggio più lungo inizia con un piccolo passo.
Si vis pacem, para bellum!!!
Mark Zuckerberg ha reso suoi schiavi milioni di persone senza che se ne rendessero conto. F.G.
<Avete vinto voi,ma almeno non riuscirete a considerarmi vostro complice> Da Mediterraneo.
Inferno,Canto III,verso 51 Virgilio dice.........
double_wrap




una ogni 100 livelli
una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
18.09.2020, alle ore 18:11
proviamo...

Per prendere il TERZO byte si puo' fare ad esempio

unsigned char dato3A;
..
dato3A= rxBuff[2]; // prende il 3^ byte (0,1,2)
Serial.print(dato3A, HEX); // per vedere se corrisponde

Ipotizziamo che il terzo byte sia un numero fra 0-255, per usarlo nei calcoli serve un <casting> (conversione del tipo di variabile lasciando inalterato il contenuto)

int dato3B;
...
dato3B= int(dato3A); // converte il tipo di variabile da char ad int
Serial.println(dato3B); // stampa il dato in formato decimale

la sequenza stampata in esadecomale
34,14,34,14,3C,1C,14,1C,3C,1C,3C,24,4,24,4,24,4,24,0C,2C
diventa decimale nei calcoli
52,20,52,20,60,28,20,28,60,28,60,36,4,36,4,36,4,36,12,44

Prova a vedere se co ho preso

Purtoppo non conosco il protocollo canbus delle auto, quindi ID, filtri, mask e valori. Magari e' la volta che imparo qualcosa.


ps. intanto grazie per la board col MCP2515, quindi basta collegare i 4 fili <+>,<gnd>,<canL>, <canH> al connettore per leggere i flussi?






"se peso cado, ma se cado non peso"
adamatj.altervista.org
FrancoGual



[pagine pubblicate]

postato il:
18.09.2020, alle ore 18:38
5 fili, non dimenticare il filo interrupt. che alla fine gestisce la ricetrasmissione.
Intanto grazie.. io provo.



Anche il viaggio più lungo inizia con un piccolo passo.
Si vis pacem, para bellum!!!
Mark Zuckerberg ha reso suoi schiavi milioni di persone senza che se ne rendessero conto. F.G.
<Avete vinto voi,ma almeno non riuscirete a considerarmi vostro complice> Da Mediterraneo.
Inferno,Canto III,verso 51 Virgilio dice.........
FrancoGual



[pagine pubblicate]

postato il:
18.09.2020, alle ore 19:52
Perdona l'ottusità binaria...
Ma sai dove dovrei collocare i comandi che mi hai consigliato?
Suppongo il loop, ma ho qualche errore e non so se sono io o io..
Scusa.
Dovremmo trovare un modo per scambiare i files.



Anche il viaggio più lungo inizia con un piccolo passo.
Si vis pacem, para bellum!!!
Mark Zuckerberg ha reso suoi schiavi milioni di persone senza che se ne rendessero conto. F.G.
<Avete vinto voi,ma almeno non riuscirete a considerarmi vostro complice> Da Mediterraneo.
Inferno,Canto III,verso 51 Virgilio dice.........
double_wrap




una ogni 100 livelli
una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
18.09.2020, alle ore 20:27
cosi' dovrebbe andare salvo mettere a posto le stampe, se sbaglio che qualcuno mi corregga!

 
unsigned char dato3A; 
int dato3B; 

void setup() {
....
}

void loop(){
if(!digitalRead(2)) {                   
  CAN0.readMsgBuf(&rxId, &len, rxBuf); 
  ....
  ....
  dato3A= rxBuff[2]; // prende il 3^ byte (0,1,2)
  Serial.print(dato3A, HEX); // per vedere se corrisponde 
  dato3B= int(dato3A); // converte il tipo di variabile da char ad int
  Serial.println(dato3B); // stampa il dato in formato decimale 
  ....
  // fai qualcosa con <dato3B> 
  ....
  }  // fine dati canbus presenti
...  
}    // fine loop



la settimana prossima faccio l'ordine per la basetta MCP2515 e cerco qualcosa sul protocollo canbus, mi serve per tenermi attivo... intanto qui c'e' un corso da ben 100 pagine (serve registrarsi gratuitamente), magari spiega qualcosa sui dati!
https://www.elettronicain.it/prodotto/alla-scoperta-del-can-…




"se peso cado, ma se cado non peso"
adamatj.altervista.org
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 

 
 
indietro | homepage | torna su copyright © 2004/2020 GRIX.IT - La community dell'elettronica Amatoriale