Arduino Spielerreien: Part1 Chronilauf

Black-Jack

Lernender Modder
Hallo Gemeinde,
Ich wollte eigentlich das ganze erst präsentieren wenn ich fertig bin aber momentan stosse ich auf Schwierigkeiten die ich so nicht erwartet habe. Wenn jemand Ahnung von Arduino hat und mir 1-5 Dinge dazu sagen kann wär das Hilfreich.

Ich habe vor den Lauf Chroni von @BrittLiv nach zu bauen.
https://www.instructables.com/id/Measure-the-speed-of-Nerf-darts/

1. Problem der Arduino den ich bestellt habe ist mit einem festen ic (Atmega328) ausgestattet nicht so wie in den meisten anderen Fällen mit einem austauschbaren. Ich nehme an das ist egal und ich kann trotzdem die Atmegas damit programmieren.

2. Problem die Treiber (SAA1064) für die 7 Segment Anzeige sind nicht mehr erhältlich.
Als Ersatz, in der Hoffnung es funktioniert hab ich mir jetzt einen TM1637 bestellt, der müsste Treiber und Anzeige in einem Stück vereinen.
 
Zuletzt bearbeitet:

Dominik

Auf Blasted zuhause
Punkt 1 ist unklar, da scheinen Worte zu fehlen.

Bei Punkt zwei musst du dafür sorgen, dass die Eingänge und benötigten Signale identisch sind. Da die Kommunikation vom Arduino aber über I2C-Bus erfolgt sollte das aber kein Problem sein.
 

Black-Jack

Lernender Modder
Texterkennung kann Texte unleserlich machen.

Was ich meinte ist das der "Standard" arduino Uno einen Ic (daraus hat mein Telefon ein ich gemacht) hat den man austauschen kann. Bei meiner Version ist der Chip fest verlötet, was mich erst Mal irritiert hat. Mit der Segment Anzeige hab ich vermutlich ein allinone Teil, muss aber den Code anpassen, weil es dann die i2c Schnittstelle nutzt. Richtig? In Brittlivs Anleitung ist es ja zweiteilig Treiber und Anzeige.

Fortschritte:
Die Bauteile sind bestellt, was ich blöderweise vergessen habe sind Batterie Halter und Platinen Platte.
Und ein paar Schalter, denn ich plane das ganze um eine Ammo counter zu erweitern.
nichts desto trotz denke ich das ich wenn ich aus dem Urlaub nächste Woche zurück bin mit dem Programmieren und testen loslegen kann.

Fragen zum Schaltplan:
Links im Bild hab ich etwas Markiert, ich vermute das ist der 16 mhz taktgeber, aber im Schaltplan hat der 3 verbindungen, in real hat er nur 2. das überfragt mich. Etwas weiter rechts sind 2 Pins am IC verbunden und mit einem kurzen stück dran, das nicht weiterführt.
Was ist das ?
 

Anhänge

  • Schaltplanmarkiert.jpg
    Schaltplanmarkiert.jpg
    98 KB · Aufrufe: 6
Zuletzt bearbeitet:

Black-Jack

Lernender Modder
Es geht weiter, da ich gerade im Ausland bin und und vermutlich jetzt erst die nötigen teile kommen, betreibe ich schon etwas Codeanpassungen.
Viel Respekt vor @BrittLiv und ihrer Arbeit, leider hat sich beim Arduino einiges geändert, bzw sind manche teile in der Form nicht mehr zu bekommen.
Deshalb ein Coderework von mir, angepasst an ein Tm1637 Display.

In Problem habe ich noch in Zeile 139 da in der aktuellen Bounce2.h so nicht vorgesehen ist. Aber dem Problem nehm ich mich morgen an.
Spoiler: 

#include "TM1637Display.h"
#include "Bounce2.h"

//byte diaplayAddr = 0x70 >> 1; // Address of the I2C control
//int digitBytes[16]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113}; // 0 1 2 3 4 5 6 7 8 9, decimal point = +128

#define CLK A5 //can be any digital pin
#define DIO A4 //can be any digital pin
TM1637Display display(CLK, DIO);

//light barrier
int LSFrontPin = A0; //light barrier at the front of the barrel
int LSBackPin = A1; //light barrier at the back of the barrel
int TriggerPin = 11;

float meanVal = 0;
float meanCount = 0;

//Datenverarbeitung
int LSFrontVal = 0;
int LSBackVal = 0;
int BaseLineFront = 0;
int BaseLineBack = 0;

//threshold, to recognise a dart
int TriggerFront = 0;
int TriggerBack = 0;

//measuring the speed
int measuringBack = 0;
float length = 0.173; //m
int loopTime = 100; //time of the measuring point in micro seconds
unsigned long measureLoops = 0;
unsigned long heartBeat = 0;

float TempBaseLineFront = 0;
float TempBaseLineBack = 0;

Bounce Taster = Bounce(TriggerPin, 10);

void setup(){
Serial.begin(9600);
//Wire.begin(); // start up I2C bus
delay(500);
// createDisplay();
pinMode(LSFrontPin, INPUT);
pinMode(LSBackPin, INPUT);
pinMode(TriggerPin, INPUT);
delay(1000);
//create a base line
for (int ii=0; ii<100; ii++){
TempBaseLineFront = TempBaseLineFront + analogRead(LSFrontPin);
TempBaseLineBack = TempBaseLineBack + analogRead(LSBackPin);
delay(10);
}
BaseLineFront = (int)(TempBaseLineFront / 100);
TriggerFront = (int)(0.8*BaseLineFront);
BaseLineBack = (int)(TempBaseLineBack / 100);
TriggerBack = (int)(0.8*BaseLineBack);

//Show that the initialisation is done: blink three times with the base line values
writeNumber(TriggerFront, 500);
delay(200);

writeNumber(TriggerBack, 500);
delay(200);
// writeNumber(888, 500);
// delay(200);
// writeNumber(888, 500);
// delay(200);
// writeNumber(888, 500);
// delay(200);
measuringBack = 1; //start measuring and wait for the darts
}



void writeNumber(int number, int waitTime){
// creat number and show it for waitTime ms
int digit1 = number/100;
int digit2 = (number - (digit1*100)) / 10;
int digit3 = number - digit1*100 - digit2*10;
Serial.println(number);
Serial.print("digit1: "); Serial.println(digit1);
Serial.print("digit2: "); Serial.println(digit2);
Serial.print("digit3: "); Serial.println(digit3);
display.showNumberDec(number);

delay(waitTime);
display.showNumberDec(number);
}

void heartBeatBeat(){
display.setBrightness(0); //lets the decimal point Increase Brightness
uint8_t segto; int value = 1244;
segto = 0x80 | display.encodeDigit((value / 100)%10);
display.setSegments(&segto, 1, 1); //Schaltet die Doppelpunke ein.
display.setBrightness(1);
display.setBrightness(2);
display.setBrightness(3);
display.setBrightness(4);
display.setBrightness(5);
display.setBrightness(6);
display.setBrightness(7);
display.setSegments(&segto, 0, 0); //Richtig?

display.showNumberDec(1,false,1,0); //1000
display.showNumberDec(2,false,1,1); //0200
display.showNumberDec(3,false,1,2); //0030
display.showNumberDec(4,false,1,3); //0004

for (int i=0; i < 999; i++){
display.showNumberDec(i);
delay(20);
}


}


void loop(){
//Hearbeat interval
if (millis() > (heartBeat + 5000)){
heartBeat = millis();
heartBeatBeat();
}
//read the push button
Taster.update();
int TasterStatus = Taster.read();
unsigned long duration = Taster.duration();
if ((TasterStatus == HIGH) && (duration < 2000)){
writeNumber((int)(meanVal*10/meanCount), 1000);
}
else if (TasterStatus == HIGH){
Serial.println("reset");
writeNumber(0, 500); delay(200);
writeNumber(0, 500); delay(200);
writeNumber(0, 500); delay(200);
meanVal = 0;
meanCount = 0;
delay(500);
}
//delayMicroseconds(loopTime);
//if (digitalRead(TriggerPin) == HIGH) { Serial.println("Trigger!"); }
if (measuringBack == 1){
//Pfeil wurde noch nicht detektiert
LSBackVal = analogRead(LSBackPin);
if (LSBackVal < TriggerBack) { measuringBack = 0; measureLoops = micros(); Serial.print("Start Trigger :"); Serial.println(TriggerBack); Serial.println(LSBackVal); }
}
else
{
//dart was detected, but didn't arrive in the front
LSFrontVal = analogRead(LSFrontPin);
if (LSFrontVal < TriggerFront){
unsigned long stopTime=micros();
float deltaTus = (float)(stopTime-measureLoops);
deltaTus = deltaTus / 1.0e6;
float mSpeed = length / deltaTus;
measuringBack = 1;

Serial.println(measureLoops);
Serial.println(stopTime);
Serial.println(deltaTus);
Serial.println(mSpeed);

meanCount = meanCount + 1;
meanVal = meanVal + mSpeed;

Serial.println(meanVal);
Serial.println(meanCount);

writeNumber((int)(mSpeed*10), 500);
delay(200);
}
}
//#Reset after 1 s
if ((measuringBack == 0) && (micros() > (measureLoops + 1000000)))
{
measuringBack = 1;
}
}

 

Dominik

Auf Blasted zuhause
Aus welchem Grund hast du einzelne Codezeilen auskommentiert? Sind das die Zeilen die einen bestimmten Typ Display ansprechen?
 

Black-Jack

Lernender Modder
Die obersten 3 Male hab ich die alte Display Ansteuerung auskommentiert, beim Rest sind es von @BrittLiv auskommentierte Dinge.
 
Zuletzt bearbeitet:

Black-Jack

Lernender Modder
soo Lange zeit passierte hier nichts, jetzt bin ich aber wieder in Stück weiter.
nachdem ich Quasi mit dem code noch mal bei 0 anfing ging es dieses mal besser, da ich vorher Sachen auskommentiert habe die wichtig waren.
Der Code den BrittLiv geschrieben hat ist bis auf die Ausgabe unberührt und liefert realistische Ergebnisse. Mangels Heißkleber um die Fototransistoren einzukleben, erfolgt der große Test im zusammengebauten Rohr in kürze.
2 Testungen auf dem Schreibtisch ergaben 127 (12,7) und 134 (13,4) m/s
Spoiler: 

#include "TM1637Display.h"

//#include "Wire.h" // I2C control
#include "Bounce2.h"

#define CLK A5 //can be any digital pin
#define DIO A4 //can be any digital pin
TM1637Display display(CLK, DIO);
uint8_t data[] = {0x0, 0x0, 0x0, 0x0};



//byte diaplayAddr = 0x70 >> 1; // Address of the I2C control
int digitBytes[16]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113}; // 0 1 2 3 4 5 6 7 8 9, decimal point = +128

//light barrier
int LSFrontPin = A0; //light barrier at the front of the barrel
int LSBackPin = A1; //light barrier at the back of the barrel
int TriggerPin = 11;

float meanVal = 0;
float meanCount = 0;

//Datenverarbeitung
int LSFrontVal = 0;
int LSBackVal = 0;
int BaseLineFront = 0;
int BaseLineBack = 0;

//threshold, to recognise a dart
int TriggerFront = 0;
int TriggerBack = 0;

//measuring the speed
int measuringBack = 0;
float length = 0.169; //m
int loopTime = 100; //time of the measuring point in micro seconds
unsigned long measureLoops = 0;
unsigned long heartBeat = 0;

float TempBaseLineFront = 0;
float TempBaseLineBack = 0;

Bounce Taster = Bounce();

void setup(){
Serial.begin(9600);
// Wire.begin(); // start up I2C bus
delay(500);
//createDisplay();
pinMode(LSFrontPin, INPUT);
pinMode(LSBackPin, INPUT);
pinMode(TriggerPin, INPUT);

// Setup the button
pinMode( TriggerPin ,INPUT);
// Activate internal pull-up (optional)
digitalWrite( TriggerPin ,HIGH);
// After setting up the button, setup the object
Taster .attach( TriggerPin );
Taster .interval(5);
delay(1000);
//create a base line
for (int ii=0; ii<100; ii++){
TempBaseLineFront = TempBaseLineFront + analogRead(LSFrontPin);
TempBaseLineBack = TempBaseLineBack + analogRead(LSBackPin);
delay(10);
}
BaseLineFront = (int)(TempBaseLineFront / 100);
TriggerFront = (int)(0.8*BaseLineFront);
BaseLineBack = (int)(TempBaseLineBack / 100);
TriggerBack = (int)(0.8*BaseLineBack);

//Show that the initialisation is done: blink three times with the base line values
writeNumber(TriggerFront, 500);
delay(200);

writeNumber(TriggerBack, 500);
delay(200);
// writeNumber(888, 500);
// delay(200);
// writeNumber(888, 500);
// delay(200);
// writeNumber(888, 500);
// delay(200);
measuringBack = 1; //start measuring and wait for the darts
}

/*void createDisplay(){
Wire.beginTransmission(display);
Wire.write(B00000000); // entgegen
// Subadressing: B00000001 = Digit 1, Subadressing: B00000010 = Digit 2, Subadressing: B00000011 = Digit 3, Subadressing: B00000100 = Digit 4
Wire.write(B00110111); // control byte (dynamic modus on, 9 mA)
Wire.endTransmission();

Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(digitBytes[0]); // digit 1 (RHS)
Wire.write(digitBytes[1]); // digit 2
Wire.write(digitBytes[2]); // digit 3
Wire.endTransmission();


Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(digitBytes[9]); // digit 1 (RHS)
Wire.write(digitBytes[0] + 128); // digit 2 + Dezimal point
Wire.write(digitBytes[1]); // digit 3
Wire.endTransmission();
} */

void writeNumber(int number, int waitTime){
// creat number and show it for waitTime ms
int digit1 = number/100;
int digit2 = (number - (digit1*100)) / 10;
int digit3 = number - digit1*100 - digit2*10;
Serial.println(number);
Serial.print("digit1: "); Serial.println(digit1);
Serial.print("digit2: "); Serial.println(digit2);
Serial.print("digit3: "); Serial.println(digit3);
/* Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(digitBytes[digit3]); // digit 1 (RHS)
Wire.write(digitBytes[digit2] + 128); // digit 2 + decimal point
Wire.write(digitBytes[digit1]); // digit 3
Wire.endTransmission();
delay(waitTime);
Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(0); // digit 2 + decimal point
Wire.write(0); // digit 3
Wire.endTransmission(); */
display.showNumberDec(number);

delay(waitTime);
display.showNumberDec(number);
}

void heartBeatBeat(){
//lets the decimal point blink
/* Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(128); // digit 2 + decimal point
Wire.write(0); // digit 3
Wire.endTransmission();
delay(100);
Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(0); // digit 2 + decimal point
Wire.write(0); // digit 3
Wire.endTransmission(); */
display.setBrightness(2);

display.showNumberDec(1,false,1,0); //1000
delay(100);
display.setSegments(data);
display.showNumberDec(2,false,1,1); //0200
delay(100);
display.setSegments(data);
display.showNumberDec(3,false,1,2); //0030
delay(100);
display.setSegments(data);
display.showNumberDec(4,false,1,3); //0004
delay(100);
display.setSegments(data);

/*for (int i=0; i < 12; i++){
display.showNumberDec(i);
delay(50);
}*/

//uint8_t segto; int value = 1244; segto = 0x80 | display.encodeDigit((value / 100)%10); display.setSegments(&segto, 1, 1);
//delay(500);
//display.setSegments(data);
}


void loop(){
//Hearbeat interval
if (millis() > (heartBeat + 5000)){
heartBeat = millis();
heartBeatBeat();
}
//read the push button
Taster.update();
int TasterStatus = Taster.read();
unsigned long duration = Taster.duration();
if ((TasterStatus == HIGH) && (duration < 2000)){
writeNumber((int)(meanVal*10/meanCount), 1000);
}
else if (TasterStatus == HIGH){
Serial.println("reset");
writeNumber(0, 500); delay(200);
writeNumber(0, 500); delay(200);
writeNumber(0, 500); delay(200);
meanVal = 0;
meanCount = 0;
delay(500);
}
//delayMicroseconds(loopTime);
//if (digitalRead(TriggerPin) == HIGH) { Serial.println("Trigger!"); }
if (measuringBack == 1){
//Pfeil wurde noch nicht detektiert
LSBackVal = analogRead(LSBackPin);
if (LSBackVal < TriggerBack) { measuringBack = 0; measureLoops = micros(); Serial.print("Start Trigger :"); Serial.println(TriggerBack); Serial.println(LSBackVal); }
}
else
{
//dart was detected, but didn't arrive in the front
LSFrontVal = analogRead(LSFrontPin);
if (LSFrontVal < TriggerFront){
unsigned long stopTime=micros();
float deltaTus = (float)(stopTime-measureLoops);
deltaTus = deltaTus / 1.0e6;
float mSpeed = length / deltaTus;
measuringBack = 1;

Serial.println(measureLoops);
Serial.println(stopTime);
Serial.println(deltaTus);
Serial.println(mSpeed);

meanCount = meanCount + 1;
meanVal = meanVal + mSpeed;

Serial.println(meanVal);
Serial.println(meanCount);

writeNumber((int)(mSpeed*10), 500);
delay(200);
}
}
//#Reset after 1 s
if ((measuringBack == 0) && (micros() > (measureLoops + 1000000)))
{
measuringBack = 1;
}
}

 
Zuletzt bearbeitet:

Black-Jack

Lernender Modder
erster test des Prototypen. hab das Display falsch herum :-/ eingebaut.
 

Anhänge

  • IMG_20180928_145253986.jpg
    IMG_20180928_145253986.jpg
    2,6 MB · Aufrufe: 13

Black-Jack

Lernender Modder
so neues Display, jetzt auch in weiss, blau und grün vorhanden.
zum code erweitern bin ich leider nicht gekommen, weil ich ein kabel versehentlich gezogen hab und dann die schaltung neu stecken musste.

Ein Tag später:
Was jetzt noch zu tun ist bevor ich es auf den Chip spiele und zusammenlöte:
-Punkte bei den Kommastellen aktivieren
-den Fehler finden warum es noch nicht vom Countermodus zurück geht
-
 
Zuletzt bearbeitet:

Being blasted

Du bist Dartblaster Fan? Dann lass' dir blasted.de nicht entgehen!
Wir sind die größte deutsche Community rund um Nerf und Dartblaster-Modding.
Finde tausende Anleitungen für Mods, Hilfe bei Problemen, Antworten auf deine Fragen.
Verpasse keine Neuigkeiten aus der großartigen, bunten Welt der Schaumstoff-Guns.
Die Mitgliedschaft im Forum ist kostenlos und die Community freut sich auf dich!

Noch Fragen? Dann kontaktiere uns. Wir sind nur ein bisschen verrückt. ;)

Get blasted

Oben Unten