DIY hardware racing sim
Unul dintre oamanii care au cumparat de la mine avea un link pe IM catre un proiect personal foarte interesant, un simulator hardware pentru racing. Pe blogul proiectului prezinta in mare pasii necesari pentru al realiza dar inca nu este nici o schema. Din cate am inteles, primul pas este realizarea unui bord controlat de PC iar sistemul este compus dintr-o placa arduino, un dashboard de BMW 325i din '92 si o interfata arduino <-> dashboard.
Cocoa (Mac osx) / c# (win) -> arduino via portul serial
Un tutorial + cod pentru comunicarea pe portul serial cu o placa arduino. Din pacate si aceste exemple sunt tot intr-o singura directie (PC -> arduino) dar sunt foarte simple si usor de invatat. Cel pentru mac nu am avut unde sa-l testez dar presupun ca functioneaza, se pare ca este acelasi cod cu acesta.
Dupa ce termin cu firma, gasesc contabil si fac comenzi la o gramada de furnizori promit ca o sa scriu eu o librarie cu evenimente pentru platforma .net care sa permita comunicarea arduino -> PC :).
Codul sursa + explicatii VIA instructables.com
codul sursa - download direct, ca sa nu mai trebuiasca sa va faceti cont pe site-ul acela.
Visual basic .net 2008 -> arduino LCD
Proiectul acesta arata cat la suta este folosit din procesor. Este facut in visual basic .net 2008 si foloseste codul pentru arduino scris mai devreme care afiseaza direct pe LCD tot ce primeste via portul serial. Am schimbat doar viteza de comunicare de la 9600 bounds la 115200 bounds.
- Download si uploadeaza codul pentru arduino
- Download codul sursa visual basic (va trebuie visual basic express pentru a-l rula). Daca nu aveti Visual Basic-ul instalat, aici este aplicatia gata compilata si pregatita pentru rulare.
'Clasa visual basic .net 2008
'pentru comunicarea seriala cu arduino
'TODO: inca nu stie sa primeasca info
' de la arduino
'by electronista.ro
Imports System
Imports System.IO.Ports
Public Class arduinoSerial
Dim comPort_ As String = "COM3"
Dim comSpeed_ As Integer = 9600
Dim WithEvents Port As SerialPort
Public Property comPort()
Get
Return comPort_
End Get
Set(ByVal value)
comPort_ = value
End Set
End Property
Public Property comSpeed()
Get
Return comSpeed_
End Get
Set(ByVal value)
comSpeed_ = value
End Set
End Property
Public Sub open()
Port = New SerialPort(comPort_, comSpeed_, Parity.None, 8, StopBits.One)
Port.Open()
End Sub
Public Sub close()
Port.Close()
Port.Dispose()
End Sub
Public Function send(ByVal text As String)
Try
Port.Write(text)
Return True
Catch ex As Exception
Return "error: " & ex.Message
End Try
End Function
End Class
LCD smartie + LCD shield
LCD smartie este un program pentru afisarea pe LCD, acesta poate afisa frecventa curenta a procesorului, cpu load-ul, piesa curenta din winamp etc... Din pacate ultima versiune a programului este din 2007 si numai versiunea 5.4 merge pe windows 7/vista (versiunea 5.4.1 nu merge).
Programul simuleaza pe arduino un LCD de tipul Matrix Orbital, care este compatibil cu softul LCD smartie, acesta comunicand cu lcd-ul via portului com virtual.
- instalati libraria lcd-ului LCD4Bit_mod
- download arduino sketch
- compilaza si uploadeaza schita arduino
- download LCD smartie
- setare LCD smartie
Cititi tot tutorialul pe: nuelectronics.com
Arduino – comunicare PC -> lcd shield
Codul de mai jos afiseaza pe lcd tot ce primeste de pe portul serial. La sfarsitul primei linii coboara cursorul pe randul al doilea iar cand si pe acest rand ajunge la sfarsit, muta cursorul de la inceput pe primul rand. Pentru a trimite informatii spre lcd se poate folosi serial monitor-ul din IDE-ul arduino.
Pentru a sterge tot ce este pe lcd trimiteti caracterul "~" (shift + tasta de deasupra la TAB).
Arduino foloseste libraria LCD4Bit_mod pentru a comunica cu LCD shield-ul, puneti continutul arhivei in arduino folder\libraries.
ATENTIE: uneori apar probleme cu prima linie din codul acesta, probabil de la cum sunt codate caracterele de wordpress/chrome etc... Daca va da erori incercati sa stergeti prima linie dupa care dati click in meniul pe sketch-> Import library... -> LCD4Bit_mod SAU download sketch.
#include
LCD4Bit_mod lcd = LCD4Bit_mod(2);
char inByte; //caracterul curent de pe serial
void setup() {
//initializam lcd-ul si portul serial
lcd.init();
lcd.clear();
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
//citim caracterul
inByte = Serial.read();
Serial.println(inByte);
//afisam caracterul pe lcd
displayContChar(inByte);
}
}
/*
* Display on lcd
* Copyright electronista.ro
*/
int displayCurPosX = 0; //coloanele de la 0
int displayCurPosY = 1; //randurile incep de la 1
char convertToStr[2] = "0"; //pt conversia char to string
void displayContChar(char mychar) {
if (mychar == '~') {
//reseteaza totul cand primim ~
lcd.clear();
displayCurPosX = 0;
displayCurPosY = 1;
return;
}
//convertim char to char array
convertToStr[0] = mychar;
if (displayCurPosX == 16) {
//0 - 15 digits - am ajuns la sf
displayCurPosX = 0;
if (displayCurPosY == 1) {
//mergem pe linia 2
displayCurPosY = 2;
lcd.cursorTo(displayCurPosY, displayCurPosX);
} else {
//revenim pe prima linie
displayCurPosY = 1;
lcd.cursorTo(displayCurPosY, displayCurPosX);
}
}
//dupa ce am setat cursorul mai sus
//afisam caracterul
lcd.printIn(convertToStr);
displayCurPosX ++;
}
// bug cu js code highlight
Arduino – comunicare PC -> Arduino
Pentru acest monatj o sa legam un led pe pinul 13 digital, dupa care o sa-l controlam de pe PC via monitorului serial care vine cu ide-ul arduino.
Hardware-ul
legati led-ul pe pinul 13 ca si in tutorialul acesta.
Software-ul
Codul este foarte simplu:
- initializam led-ul si portul serial
- intram in loop unde verificam daca este ceva in bufferul serial
- daca este ceva in buferul serial, vedem daca am primit o - oprim ledul | p - pornim led-ul
//inchar - tinem caracterul de pe serial
//inchar - tinem caracterul de pe serial
char inChar;
int ledPin = 13; //pinul led-ului
void setup() {
Serial.begin(9600); // setam serial com
pinMode(ledPin, OUTPUT); //setam output pt led
}
void loop() {
//vedem daca este ceva in bufferul pt serial
if (Serial.available() > 0) {
//luam primul caracter
inChar = Serial.read();
//il printam
Serial.println(inChar);
if (inChar == 'o') {
//led Oprit
Serial.println("LED oprit");
digitalWrite(ledPin, LOW);
}
if (inChar == 'p') {
//led Pornit
Serial.println("LED pornit");
digitalWrite(ledPin, HIGH);
}
}
}
Deschideti serial monitor-ul, scrieti 'p' si dati click pe send - led-ul se va aprinde.
Arduino – Debug tutorial
Cum detectezi probleme unui soft sau a unui montaj din jurul arduino cand placa nu are nici un instrument de afisare onboard? S-a blocat programul din cauza unei greseli sau programul o ia pe calea gresita a unui if sau un contact face probleme? Nu ai de unde sa stii ca programul a rulat bine daca nu ai o metoda prin care placa sa-ti transmita ca lucreaza ok.
arduino 2 pc.... arduino 2 pc
Arduino are onboard un port serial, acesta poate folosii fie pinii 0 si 1 de pe placa fie conexiunea usb cu calculatorul. Pentru debug folosim conexiunea cu pc-ul via virtual usb com. Placa o setam sa transmita niste mesaje iar pe pc deschidem serial monitorul ce vine cu IDE-ul arduino.
The code:
int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600); //initializam libraria Serial
Serial.println("Am pornit!"); //trimitem un msg via com
}
void loop()
{
digitalWrite(ledPin, HIGH);
Serial.println("LED pornit :)");
delay(1000);
digitalWrite(ledPin, LOW);
Serial.println("LED oprit :|");
delay(1000);
}
Rezultat-ul:
Arduino – LED blink tutorial
Acesta este primul tutorial de pe electronista.ro :) si acopera urmatoarele chestii:
- O parte din functiile arduino si cum sunt chemate de program
- Exemplu simplu pentru folosirea variabilelor
- Folosim un pin pentru output digital
Hardware-ul
Polaritatea led-ului:
Cum se leaga LED-ul la arduino:
ATENTIE: nu conectati ledul pe alti pini fara rezistenta, pe pinul 13 arduino are o rezistenta pe placa de 1K. Majoritate ledurilor functioneaza la 3 - 3.3V iar arduino scoate pe pini digitali 5V. LED-ul se va arde si e posibil sa ia si pinul digital cu el daca il conectati direct pe alti pini fara rezistenta.
Software-ul
// Initializam o variabila globala de tip integer (numar intreg)
int ledPin = 13;
// Functia setup() este chemata prima data cand porneste controlerul
void setup() {
// Setam pinul 13 pentru output digital
//(acesta va scoate +5v in starea HIGH sau 0V in stare LOW)
pinMode(ledPin, OUTPUT);
}
// Functia loop ruleaza cat de repede posibil
// si se repeta atata timp cat arduino are curent
void loop() {
digitalWrite(ledPin, HIGH); // Aprinde LED-ul
delay(1000); // Asteptare de 1000 ms (1 sec)
digitalWrite(ledPin, LOW); // Stange LED-ul
delay(1000); // Asteptare de 1000 ms (1 sec)
}









