hallo, iedereen
ik ben bezig met een eigengemaakte bar code scanner. ik gebruik daarvoor de arduino mega2560. De bedoeling is dat de scanner de zwart witte blokjes leest met 2 line tracking sensoren.
eentje is om waar te nemen dat de blokjes veranderen en de andere is voor de daadwerkelijke code.
het zijn in het totaal acht blokjes, Zodat ik de output kan gebruiken als een binaire code en die om te zetten in decimalen.
om de codes automatisch te lezen heb ik een papiertje met 4 codes vastgemaakt aan een band van een robot.
die band laat ik rond draaien en zo komen de codes langs de sensor.
dit alles werkt nog.
nu heb ik er iets ingezet waardoor hij een opdracht krijgt om te stoppen op een willekeurig nummer. van 1 t/m 3 (het horen er 4 te zijn maar ik heb per ongeluk 2x de binaire code 1 uitgeprint)
dus er zijn 2 mogelijkheden voor 1. ook dat doet hij netjes, als hij gestopt heeft krijgt hij een nieuw willekeurig nummer ook die vind ie op en stopt hij netjes na alle 8 blokjes.
maar nu wil ik er nog iets aan toevoegen. Namelijk dat hij nog een willekeurig nummer binnekrijgt en die bepaalt na hoeveel blokjes hij stopt. bijvoorbeeld: dat hij de code die hij heeft binnen gekregen bijvoorbeeld 2.
daar zou hij dan naar toe moeten rijden en dan inplaats van te stoppen zijn vaart halveren en stoppen bij de volgende code bij een willekeurig aantal blokjes bijvoorbeeld 5.
dus dan zou hij moeten stoppen nadat hij 2 heeft gelezen en nog 5 blokjes. Ook heb ik hier een lcd aan vastgemaakt om een paar handige dingen te kunnen zien die zijn niet relevant voor mijn vraag en hoeft ook niet naar gekeken te worden. ik heb hier de code met uitleg:
///Arduino Sample Code
#include <Wire.h> //voor de lcd
#include <LiquidCrystal_I2C.h>
#include <Time.h>
#define TIME_MSG_LEN 11
#define TIME_HEADER 'T'
#define TIME_REQUEST 7
int oldval=1; //om te zien of de bovenste rij veranderd
int count=0; //veranderd elke keer als de onderste rij veranderd, elke keer als hij veranderd komt er 1 bij tot hij bij 8 komt dan word hij ge reset
int val = 1; //word gebruikt om binary om te zetten in decimal
int maxnum=8; //het maximale dat een count kan doen voor word gereset
int pos = 0; //word gebruikt om binary om te zetten in decimal
int scans = 0; //variable die veranderd elke keer dat hij een code leest
int E2 = 9; //voor het motortje
int M2 = 10; //voor het motortje
//int change = 0;
long randNumber; //een willekeurig nummer die word gebruikt voor de bovenste rij. van 1 t/m 3
long randCount; //een willekeurig nummer van 0-7 die word gebruikt voor de onderste rij
//int displayval = 0;
LiquidCrystal_I2C lcd(0x27,20,4); //voor het lcd scherm
void setup()
{
Serial.begin(9600);
int ledPin = 8; // veranderd pin 8 naar 5v
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
int ledPin2 = 7; // veranderd pin 7 naar 5v
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, HIGH);
int ledPin3 = 4; // veranderd pin 4 naar 5v
pinMode(ledPin3, OUTPUT);
digitalWrite(ledPin3, HIGH);
attachInterrupt(0, Poort, CHANGE); //de attachinterrupt (0 = pin2 zit vast aan de onderste scanner) die word gebruikt om te zien of de onderste rij veranderd zodat ie weet of hij naar de bovenste rij moet kijken
lcd.init(); //om de lcd aan te houden
lcd.backlight(); //om het achtergrond liht van het lcd scherm aan te houden
randNumber = random(1, 4); //maakt een willekeurig nummer aan 1 t/m 3
analogWrite (E2,75); //om de motor te laten draaien
digitalWrite(M2,HIGH);
lcd.setCursor(15,3); //voor het lcd scherm
lcd.print(randNumber);
lcd.setCursor(13,2);
lcd.print("Dest:");
lcd.setCursor(0,0);
lcd.print("Aantal Gescanned:");
lcd.setCursor(0,1);
lcd.print(scans);
lcd.setCursor(0,2);
lcd.print("Waarde: ");
}
void loop(){
if (count == 7) //als de count 7 heeft bereikt print hij iets op het lcd scherm
{
lcd.setCursor(0,3);
lcd.print(pos);
lcd.print(" ");
scans++; //een scan erbij als count 7 is
lcd.setCursor(0,1);
lcd.print(scans); //print scans
}
if (pos == randNumber) // als de binary code is veranderd in decimal word die opgeslagen in pos als pos gelijk is aan het willekeurig nummer laat het de motor langzamer rijden
{
analogWrite (E2,110);
lcd.setCursor(15,3); //print scans en de bestemming
lcd.print(randNumber);
randCount = random(0, 7);
if (randCount == count) //als het willekeurige nummer voor randomcount gelijk is aan count
{
analogWrite (E2, 200);
randNumber = random(1, 4);
delay(3000);
randCount = random(0, 7);
analogWrite (E2, 75); //na 3 seconde begint de loop opnieuw
}
}
}
void Poort(){ //de interrupt waarin de hij ziet of de onderste rij veranderd en zet binary om in decimal
Serial.print(count);
Serial.print(" - ");
Serial.print(digitalRead(2));
Serial.print(" - ");
Serial.print(digitalRead(3));
Serial.print(" - ");
Serial.print(randCount);
Serial.print(" - ");
Serial.print(randNumber);
Serial.print(" - ");
count++; //veranderd elke keer dat de onderste rij veranderd +1
pos = pos + (val * (1-digitalRead(3))); //zet binary om naar decimal
val = val * 2; //zet binary om naar decimal
Serial.print(pos); //output van de berekening naar monitor
Serial.println(" ");
if (count == maxnum) //als de count 8 is zet hij de nosige variablen terug
{
count = 0;
pos = 0;
val = 1;
}
}
ik hoop dat jullie hier iets van snappen als er vragen zijn alsjeblieft stel ze.
ik heb ook nog een me seriele monitor na 1 rondje
eerste rij: de "count" telt elke keer tot 7 vanaf 0 dus dat is 8 (werkt)
tweede rij: de onderste sensor zijn output die zwart,wit,zwart,wit leest (werkt)
derde rij: de bovenste rij voor de daadwerkelijke code (werkt, Fouten liggen aan de sensor niet aan de code)
vierde rij: laat de randCount zien dit is de willekeurige waarde om te stoppen op het aantal blokjes (werkt niet)
vijfde rij: laat de randNumber zien die bepaalt waar hij moet vertragen (werkt alleen hij vertraagd niet)
zesde rij: laat de "pos" zien de decimale waarde die is omgerekend van binair
0 - 0 - 0 - 0 - 2 - 1
1 - 1 - 1 - 0 - 2 - 1
2 - 0 - 1 - 0 - 2 - 1
3 - 1 - 1 - 0 - 2 - 1
4 - 0 - 1 - 0 - 2 - 1
5 - 1 - 1 - 0 - 2 - 1
6 - 0 - 1 - 0 - 2 - 1
7 - 1 - 1 - 0 - 2 - 1
0 - 0 - 0 - 0 - 2 - 1
1 - 1 - 0 - 0 - 2 - 3
2 - 0 - 1 - 0 - 2 - 3
3 - 1 - 1 - 0 - 2 - 3
4 - 0 - 1 - 0 - 2 - 3
5 - 1 - 1 - 0 - 2 - 3
6 - 0 - 1 - 0 - 2 - 3
7 - 1 - 1 - 0 - 2 - 3
0 - 0 - 0 - 0 - 2 - 1
1 - 1 - 1 - 0 - 2 - 1
2 - 0 - 1 - 0 - 2 - 1
3 - 1 - 1 - 0 - 2 - 1
4 - 0 - 1 - 0 - 2 - 1
5 - 1 - 1 - 0 - 2 - 1
6 - 0 - 1 - 0 - 2 - 1
7 - 1 - 1 - 0 - 2 - 1
0 - 0 - 1 - 0 - 2 - 0
1 - 1 - 0 - 0 - 2 - 2
2 - 0 - 1 - 2 - 3 - 2
3 - 1 - 1 - 6 - 3 - 2
4 - 0 - 1 - 6 - 3 - 2
5 - 1 - 1 - 6 - 3 - 2
6 - 0 - 1 - 6 - 3 - 2
7 - 1 - 1 - 6 - 3 - 2
ik ben geen expert met de arduino en ben pas 16 als jullie mij zouden kunnen helpen zou ik heel blij zijn alvast bedankt!
als je meer informatie nodig hebt vraag er naar!