Gå til innhold

Den lille Arduino-tråden


Anbefalte innlegg

Å lese inn lyd var litt vanskeligere enn jeg først antok, så jeg har ikke fått tid til å kikke så mye på det enda, og rekker nok ikke å se så mye på det før til sommeren. Men jeg la ved et lite program som demonstrerer bruk av seriellporten i c#. Exe-filen ligger i bin/debug, og prosjektet kan åpnes i visual studio 2010. Har ikke noen spesiell toturial innen c# å anbefale, men vil tro det burde ligge mye forskjellig ute.

 

Med programmet kan man koble seg til arduinoen ved å først velge riktig comport, og så trykke connect. Deretter kan man sende en tallverdi mellom 0 og 255.

 

For å motta på arduino, sett baudrate til 9600.

 

Jeg må si jeg ikke helt forsto hvordan du mente jeg skulle motta og benytte meg av informasjonen i et arduino-program.

 

Kan du forklare litt nærmere?

 

Koden blir vel omtrent som dette:

 

void setup(){

Serial.begin(9600);

}

 

byte received;

 

void loop(){

if(Serial.available()>0){

received = Serial.read();

}

//gjøre noe lurt med received her

}

Lenke til kommentar
Videoannonse
Annonse

Koden blir vel omtrent som dette:

 

void setup(){

Serial.begin(9600);

}

 

byte received;

 

void loop(){

if(Serial.available()>0){

received = Serial.read();

}

//gjøre noe lurt med received her

}

 

Jeg har prøvd å sette "received" som lysstyrken på en lysdiode, men det ser ikke ut til å gi så mye mening. Når jeg trykker på "Rec" begynner lysdioden å blinke litt tilfeldig, uavhengig av om jeg spiller av musikk på PC-en, eller om jeg blåser i mikrofonen.

 

 

Lenke til kommentar

 

Noen her som vet om det er vanskelig å lage seg et høvelig nøyaktig duty-cycle meter med en arduino og 4 stk 7-segment eller evt et LCD display?

 

 

 

Dette så jo interessant ut :)

 

 

Noen som vet om dette er mulig med boArudino?

 

Det er akkurat samme krets og bootloader ut i fra det jeg kan se. Så det er ingen grunn til at det ikke skulle virke.

 

 

Jeg tenkte på sånn om det er nok pinner, og "input for external interrupt"

 

Hadde vært kult og fått til :D (Har et PWM-signal jeg gjerne skulle målt....)

 

 

EDIT: hvor mange tilkoblinger mot Arduinoen har et slik display?

Endret av Puke Nukem
Lenke til kommentar

Koden blir vel omtrent som dette:

 

void setup(){

Serial.begin(9600);

}

 

byte received;

 

void loop(){

if(Serial.available()>0){

received = Serial.read();

}

//gjøre noe lurt med received her

}

 

Jeg har prøvd å sette "received" som lysstyrken på en lysdiode, men det ser ikke ut til å gi så mye mening. Når jeg trykker på "Rec" begynner lysdioden å blinke litt tilfeldig, uavhengig av om jeg spiller av musikk på PC-en, eller om jeg blåser i mikrofonen.

 

Hvis du bruker programmet med musikk (andre posten min), må du sette Serial.begin(250000).

 

Da to byte sammen er en sample, bør de settes sammen til feks en unsigned int (antar at mest signifikante kommer først).

 

unsigned int sample = Serial.read();

sample = sample << 8;

sample += Serial.read();

 

Jeg kikket litt på dataene selv, og var litt usikker på om ting funket som det skulle (Lydkortet har vært litt merkelig, så tenkte det var det). Hvis ting ikke gir mening med denne fiksen her heller, så får du si ifra.

Lenke til kommentar
Hvis du bruker programmet med musikk (andre posten min), må du sette Serial.begin(250000).

 

Da to byte sammen er en sample, bør de settes sammen til feks en unsigned int (antar at mest signifikante kommer først).

 

unsigned int sample = Serial.read();

sample = sample << 8;

sample += Serial.read();

 

Jeg kikket litt på dataene selv, og var litt usikker på om ting funket som det skulle (Lydkortet har vært litt merkelig, så tenkte det var det). Hvis ting ikke gir mening med denne fiksen her heller, så får du si ifra.

Det kan se ut som om vedien blir påvirket litt av musikk eller aktivitet rundt mikrofonen. Problemet er at verdien varierer veldig selv om musikken er av, noe som gjør det vanskelig å avgjøre om det faktisk er musikken som påvirker, eller om det er noe helt annet. Normalt vil lysdioden være av eller i hvert fall veldig svak når musikken er lav eller av, men ved denne metoden ser den ut til å være veldig variabel.

Endret av Meh.
Lenke til kommentar

Da er LCD mottatt og prøvd ut!

 

 

JEg har en rart problem her, ved bruk av diverse tegn i første rute i andre linje, så får jeg en eller flere streker som går bortover hele andre linje... Problemet forsvinner om jeg flytter alt ett hakk til venstre, altså ikke bruker første tegnet på linja.

Lenke til kommentar

Bruker du et display med seriell tilkobling eller parallell? Noen av de med seriell-konverter (multiplekser?) på baksiden har et par brytere som må være på for at skjermen skal funke normalt.

 

Jeg tror bryterne er for en slags testmodus som printer en standardmelding på skjermen.

Endret av Meh.
Lenke til kommentar
  • 1 måned senere...

I dag fikk jeg endelig gjort ferdig prosjektet mitt som gikk ut på å styre en "radiostyrt" lekebil via bluetooth, ved å bruke accelometeret på en mobil.

Brukte en Arduino Uno, blueSmirf silver bluetooth modul og en SN754410 Quad Half H-Bridge + to random motorer som sto på en gammel lekebil. Brukte det gamle chassiet.

 

Kodet telefonen ved hjelp av Google App Inventor.

Kan bistå med kode for nybegynnere som er interessert i å få til det samme :)

Lenke til kommentar

Høres ut som et morsomt prosjekt. Jeg har ingen planer om å gjøre det samme, men vil gjerne se programkoden.

 

 

const int enableFront = 9; //pwm, H-bridge motor2-framhjul
const int enableBack = 10; //pwm, H-bridge motor1-bakhjul
const int right = 2;
const int left = 3; //pwm
const int backward = 5; //pwm
const int forward = 6; //pwm

int key;

void setup() {
 Serial.begin(115200);
 pinMode(left, OUTPUT); 
 pinMode(right, OUTPUT); 
 pinMode(forward, OUTPUT); 
 pinMode(backward, OUTPUT); 
 pinMode(enableFront, OUTPUT);
 pinMode(enableBack, OUTPUT);
 digitalWrite(enableFront, HIGH); 
 digitalWrite(enableBack, HIGH);
}

void loop() {
 if (Serial.available() ) {
   key = Serial.read(); 
   Serial.write('key'); //unødvendig, brukt til debugging
   if (key == '0') {
     stop(); //disable motor
   }  else if (key == '+') {
     start(); //enable motor
   }
   else if (key == '1') {
     runForwards(1); 
   } 
   else if (key == '2') {
     runForwards(2);
   } 
   else if (key == '3') {
     runForwards(3); 
   } 
   else if (key == '4') {
     runBackwards(1);
   } 
   else if (key == '5') {
     runBackwards(2);
   } 
   else if (key == '6') {
     runBackwards(3);
   } 
   else if (key == '7') {
     turnLeft(true); 
   } 
   else if (key == '8') {
     turnLeft(false); // turnRight(false) gjør samme nytten
   } 
   else if (key == '9') {
     turnRight(true); 
   }
 }
}

void stop() {
 digitalWrite(enableBack, LOW);
}

void start() {
digitalWrite(enableBack, HIGH);
}

void changeVoltageBack(boolean f, boolean b) {
 if (f == true) {
   digitalWrite(forward, HIGH);
 } 
 else {
   digitalWrite(forward, LOW); 
 }
 if (b == true) {
   digitalWrite(backward, HIGH); 
 } 
 else {
   digitalWrite(backward, LOW); 
 } 
}

void changeVoltageFront(boolean l, boolean r) {
 if (l == true) {
   digitalWrite(left, HIGH);
 } 
 else {
   digitalWrite(left, LOW); 
 }
 if (r == true) {
   digitalWrite(right, HIGH); 
 } 
 else {
   digitalWrite(right, LOW); 
 } 
}

void runForwards(int speed) {
 if (speed > 0 && speed < 4) { 
   analogWrite(enableBack, map(speed, 0,3,0,255)); //pwm for variabel fart
   if (speed == 0) {
     changeVoltageBack(false, false);
   } 
   else {
     changeVoltageBack(true, false);
   }
 }
}

void runBackwards (int speed) {
 if (speed > 0 && speed < 4) { 
   analogWrite(enableBack, map(speed, 0,3,0,255)); //pwm for variabel fart
   if (speed == 0) {
     changeVoltageBack(false, false);
   } 
   else {
     changeVoltageBack(false, true);
   }
 }
}

void turnLeft(boolean turn) {
 if (turn == true) {
   changeVoltageFront(true, false); 
 } 
 else {
   changeVoltageFront(false, false); 
 }
}

void turnRight(boolean turn) {
 if (turn == true) {
   changeVoltageFront(false, true);
 } 
 else {
   changeVoltageFront(false, false);
 } 
}

 

 

 

Android appen min sender enkelt og greit ASCII karakterer til Arduinoen ved å lese av Y og Z verdiene til accelometeret.

Siden den er kodet i App Inventor er det ikke så enkelt å gjengi den.

Endret av Markaren
Lenke til kommentar

Da er LCD mottatt og prøvd ut!

 

 

JEg har en rart problem her, ved bruk av diverse tegn i første rute i andre linje, så får jeg en eller flere streker som går bortover hele andre linje... Problemet forsvinner om jeg flytter alt ett hakk til venstre, altså ikke bruker første tegnet på linja.

 

Har du en kode jeg kunne fått sett ? Jeg har flere sånne diplay i drift. Litt hjemmelagde koder og litt funnet

Lenke til kommentar

Har du en kode jeg kunne fått sett ? Jeg har flere sånne diplay i drift. Litt hjemmelagde koder og litt funnet

 

 

Det skjer uansett hvilke koder jeg bruker... skal finne frem kodeeksempel...

 

SElv med standard "hello world" skjer dette, jeg har dog LCD koblet til andre pinner..

/*
 LiquidCrystal Library - Hello World

Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
library works with all LCD displays that are compatible with the 
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.

This sketch prints "Hello World!" to the LCD
and shows the time.

 The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)

Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe

This example code is in the public domain.

http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
 // set up the LCD's number of columns and rows: 
 lcd.begin(16, 2);
 // Print a message to the LCD.
 lcd.print("hello, world!");
}

void loop() {
 // set the cursor to column 0, line 1
 // (note: line 1 is the second row, since counting begins with 0):
 lcd.setCursor(0, 1);
 // print the number of seconds since reset:
 lcd.print(millis()/1000);
}

Lenke til kommentar
  • 3 uker senere...

fikk en arduino uno og endel komponeter i posten idag = D aldri holt på med det før,

 

prøvde å lage en led matrix, 3x3, men sjønte ikke helt hvordan jeg skulle lage kodene, har ikke helt sjønt hvordan jeg velger hvilken led jeg skal ha på, prøvde bare random å endre HIGH og LOW, men vart ikke noe smartere. noen som kan forklare meg hvordan det funker egentlig?

Lenke til kommentar

Du bør nok lære deg basicen i programeringsspråk som C/C++ eller java. Da blir alt mye lettere. Er ikke så mye som skal til, men for å svare på spørsmålet:

 


/**
* Rask sketch som jeg skrev uten å ha testen den selv
**/

const int ledPin = 9; //f.eks, kan vere hvilken som helst pin unntatt 0 og 1. Kan selfølgelig legge til flere.

void setup() {
pinMode(ledPin, OUTPUT); // pin 9 satt som OUTPUT
}

void loop() {
digitalWrite(ledPin, HIGH); //slå på lyset
delay(1000); //vent 1000 millisekund
digitalWrite(ledPin, LOW); //slå av lyset
delay(1000); //vent 1000 millisekund

//denne koden er for å dimme lyset ned og opp: NB! Krever pwm pin, merket med ~
for(int i = 0; i < 255; i++) {
 analogWrite(ledPin, i); //øker lysstyrken med en faktor mellom 0 og 255 (0 - 5V) hvert 100 millisekund
 delay(100);
}
for (int i = 255; i > 0; i--) {
 analogWrite(ledPin, i); //senker lysstyrken med en faktor mellom 0 og 255 (0 - 5V) hvert 100 millisekund
 delay(100);
}
}

Endret av Markaren
Lenke til kommentar

ahh takker! Ja fant ut av det dære jeg å, så tror jeg skal kjøpe C/C++ bok, men fram til da tenkte jeg at jeg kan bruke youtube, å se tutorials eller noe sånt, men fant ikke noe bra filmer om det, iværtfall ikke som har me dette å gjøre??

Endret av Formula90
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...