INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Programmierfehler oder Hardware ?
02.06.2014, 16:55
Beitrag #1
Programmierfehler oder Hardware ?
Hi

Ich bin der neue hier Wink Wollte mich den mit Thema kurz vorstellen und direkt ein kleines Problem besprechen.

Habe mir ein Prototyp von ein Laserplotter gebaut den ich mit ein Arduino Uno ansteuer der auch ohne Probleme läuft. Auf den Arduino läuft grbl.
Jetzt wollte ich mir ein etwas Professionelleren Plotter bauen mit einen Analogen Lasertreiber damit ich die Stärke einstellen kann. Leider kann ich mit grbl kein pwm Signal ausgeben um den Laser zu steuern es kennt leider nur an oder aus.
Ich bin dann auf die Idee gekommen das ein zweiter Arduino den Laser steuert und der 1te Arduino sagt wann der Laser eingeschaltet wird.

Dazu habe ich mir ein kleines Programm zusammen gebastelt, nur leider kenne ich mich mitn Programmieren nicht gut aus daher weiss ich nicht ob es ein Fehler im Programm ist oder ob es an der Hardware/Verdrahtung liegt.

Code:
const int inputPin_0 = 2;
const int inputPin_1 = 3;
volatile int state=1;                   // Variablen, die von Interruptroutinen angefasst werden, sollten "volatile" deklariert werden
volatile unsigned long lastTime=0;      // Zeitpunkt der letzten steigenden Flanke, nötig zum Entprellen


int laser = 11;
int analogPin = 5;

void setup ()
{

  pinMode(inputPin_0, INPUT);
  pinMode(inputPin_1, INPUT);
  pinMode(analogPin, INPUT);
    
  attachInterrupt(0, keyPressed_0, RISING);       // 0 ist der Interrupt für Pin 2, bei jeder steigenden Flanke wird keyPressed_0() aufgerufen
  attachInterrupt(1, keyPressed_1, RISING);       // 1 ist der Interrupt für Pin 2, bei jeder steigenden Flanke wird keyPressed_1() aufgerufen


}

void keyPressed_0(){                   // state hochzählen, falls mindestens 50ms seit der letzten Flanke vergangen sind
    unsigned long now = millis();
  if (now - lastTime > 100){           // entprellen
    state++;
    if (state > 3){state=1;}
  }
  lastTime=now;
}

void keyPressed_1(){                   // state hochzählen, falls mindestens 50ms seit der letzten Flanke vergangen sind
    unsigned long now = millis();
  if (now - lastTime > 100){           // entprellen
    state--;
    if (state < 1){state=3;}
  }
  lastTime=now;
}

void loop(){
    switch(state) {
     case 1:     led_1();
                 break;
     case 2:     led_2();
                 break;
     case 3:     led_3();
                 break;    
     //hier weitere "case" fälle ergänzen
     default:
          state = 1;
          break;
    }  
}

void led_1()

{
   int analogValue = analogRead(analogPin);
    if (analogValue > 10)
   {
    analogWrite(laser,50);
   }
else
{
    analogWrite(laser,0);
}

}

Case 2 und 3 im unteren teil habe ich weg gelassen.

Jetzt ne kurze Erklärung.
Am Pin 11 habe ich eine LED mit Widerstand angeschlossen um den Laser zu Simulieren. Am Pin 2 ein Taster mit Pulldown Widerstand.
Und am Pin A5 bin ich direkt von den +3.3 Volt über ein Taster in den Pin A5 gegangen um das Laser an Signal zu Simulieren.
Aber wenn ich jetzt den Taster drücke um den Laser ein zu schalten braucht der Arduino bestimmt eine halbe Sekunde bis er erkennt das eine Spannung am A5 anliegt und die LED einschaltet und das gleiche beim loslassen das Tasters.

So eine Verzögerung ist leider nicht zu gebrauchen in der Zeit fährt der Schlitten schon weiter und der Laser startet/endet nicht am gewünschten Punkt.

Ist der Fehler jetzt im Programm oder ist der Arduino einfach nicht schnell genug dafür ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.06.2014, 20:16
Beitrag #2
RE: Programmierfehler oder Hardware ?
Hi,
eigentlich muesste der Arduino dafuer schon schnell genug sein. Ich vermute mal, dass es etwas damit zu tun hat, dass erst einmal state 1->2->3->1 durchlaufen werden muss, bis man was sieht.
Kannst Du mal den kompletten Code reinstellen?
...ausserdem vielleicht die LED(s?) immer komplett einschalten (255), so dass man ausschliessen kann, dass die Helligkeit einfach nicht ausreicht, um was zu sehen.
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.06.2014, 20:26
Beitrag #3
RE: Programmierfehler oder Hardware ?
Hallo Phobos,

dein Projekt klingt sehr interessant. Gut dass du einfach mal so in die Ardu-Programmierung gehst. Mir fallen zwei Sachen auf (ohne dass ich tiefer in den Code reingegangen bin):
- mir blitzen die Augen wenn ich sehe dass eine Variable "now" benannt wird. Da diese in der IDE farblich hervorgehoben wird, sollte man sie anders benennen
- nimm für jede ISR eine andere Bezeichnung
- ich glaube, dass du mit
Code:
if (now - lastTime > 100){
nicht wirklich die Taster entprellst! Schau dir mal die Bounce Library dazu an.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.06.2014, 21:05 (Dieser Beitrag wurde zuletzt bearbeitet: 02.06.2014 21:22 von Phobos.)
Beitrag #4
RE: Programmierfehler oder Hardware ?
(02.06.2014 20:16)Thorsten Pferdekämper schrieb:  Hi,
eigentlich muesste der Arduino dafuer schon schnell genug sein. Ich vermute mal, dass es etwas damit zu tun hat, dass erst einmal state 1->2->3->1 durchlaufen werden muss, bis man was sieht.
Kannst Du mal den kompletten Code reinstellen?
...ausserdem vielleicht die LED(s?) immer komplett einschalten (255), so dass man ausschliessen kann, dass die Helligkeit einfach nicht ausreicht, um was zu sehen.
Gruss,
Thorsten

Hi

Die LED habe ich auch schon auf 255 gestellt leider mit den gleichen Ergebnis.
In case 2-3 hatte ich nur andere werte fürs pwm Signal eingetragen und ohne das der A5 überprüft wird. Es war erstmal nur zum testen.

Code:
void led_2()
{
  
  analogWrite(laser, 100);
                    
}

void led_3()
{
  
  analogWrite(laser, 255);



(02.06.2014 20:26)rkuehle schrieb:  Hallo Phobos,

dein Projekt klingt sehr interessant. Gut dass du einfach mal so in die Ardu-Programmierung gehst. Mir fallen zwei Sachen auf (ohne dass ich tiefer in den Code reingegangen bin):
- mir blitzen die Augen wenn ich sehe dass eine Variable "now" benannt wird. Da diese in der IDE farblich hervorgehoben wird, sollte man sie anders benennen
- nimm für jede ISR eine andere Bezeichnung
- ich glaube, dass du mit
Code:
if (now - lastTime > 100){
nicht wirklich die Taster entprellst! Schau dir mal die Bounce Library dazu an.

Grüße Ricardo

Hi
Den Code für das kleine "Menü" habe ich nicht selber geschrieben das hatte ich im Internet gefunden.
Ich bin im Programmieren leider nicht wirklich gut daher kann ich dir gerade nicht ganz folgen was du mit ISR meinst.
Aber vielen dank für den Tipp ich werde mich mal schlau machen wie man den Taster richtig entprellt.

Schonmal vielen Dank an euch beiden.

Habe das Programm mal auf das Minimum beschrenkt selbst da habe ich die Verzögerung.

Code:
int laser = 11;
int analogPin = 5;

void setup ()
{


// pinMode(analogPin, INPUT);


}


void loop()

{
  int analogValue = analogRead(analogPin);
      if (analogValue > 10)
   {
    analogWrite(laser,255);
   }
else
{
    analogWrite(laser,0);
}

}

Mir ist dabei aufgefallen das es reicht wenn ich ein Draht in pin A5 stecke und ihn einfach nur anpacke geht die LED auch an und die LED L auf dein Board leuchtet die ganze zeit.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.06.2014, 21:36
Beitrag #5
RE: Programmierfehler oder Hardware ?
Hi,
die Analog-Eingaenge sind ziemlich empfindlich. Wenn die offen sind, d.h. nicht definiert auf irgend einem Potential, dann machen die alles moegliche.
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.06.2014, 21:41 (Dieser Beitrag wurde zuletzt bearbeitet: 02.06.2014 21:56 von Phobos.)
Beitrag #6
RE: Programmierfehler oder Hardware ?
EDIT
So ich glaub das ist schon zu spät für mich hat bisle später klick gemacht ^^
Habe den A5 jetzt mal so beschaltet wie den Taster um das Programmm zu wechseln.
A5 mit ein 10KOhm auf masse und dann die 5 Volt über ein Taster auf den A5
jetzt klappt alles wie es soll.
------------

Ich glaub dann überleg ich mir besser eine andere Lösung. Wenn die wirklich so empfindlich sind und auf alles reagieren ist es zu gefährlich wenn der Laser dann einfach einschaltet. Sowas kann ein das Auge kosten Smile.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.06.2014, 22:08
Beitrag #7
RE: Programmierfehler oder Hardware ?
Zum Einschalten eines Lasers wuerde ich immer einen digitalen Eingang nehmen, der mit INPUT_PULLUP konfiguriert ist. Den Laser dann einschalten, wenn das Ding auf LOW geht. Dann duerfte man auf der sicheren Seite sein.
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.06.2014, 08:13
Beitrag #8
RE: Programmierfehler oder Hardware ?
Morgen
Erstmal vielen dank für die ganzen Tipps und die schnellen Antworten.
Habe das Programm erst mal soweit umgeschrieben das ich den Laser über Pin 7 einschalte.
Wenn ich das richtig verstanden habe reicht es wenn ich den einfach auf Masse schalte.

Jetzt muss ich nur noch die beiden Taster zum umschalten richtig entprellen.
Mit ein PCF 8547P I²C werde ich noch eine Anzeige bauen auf wieviel mW der Laser steht. Hatte den mal von ein Kollegen bekommen, er hat damit ein Lauflicht betrieben. Habe ihn auch schon erfolgreich angesteuert.

Code:
int laser = 11;
int schalter = 7;

void setup ()
{
pinMode(schalter, INPUT_PULLUP);
}

void loop()
{

   int digitalValue = digitalRead(schalter);
    if (digitalValue == LOW)
   {
    analogWrite(laser,10);
   }
else
{
    analogWrite(laser,0);
}

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Welche IDE? Arduini.cc oder .org Bilbo 1 203 17.10.2016 21:03
Letzter Beitrag: ardu_arne
  Ardublock übertragt nicht an IDE oder UNO R3 tobi83 5 325 16.10.2016 14:07
Letzter Beitrag: Pit
  Mega: Hardware i2c bus speed (Wire.) verändern? HaWe 10 2.912 14.07.2016 20:09
Letzter Beitrag: Mathias
  Programmspeicher auf i2c_EEPROM oder SD_Card erweitern? avoid 11 345 11.07.2016 15:46
Letzter Beitrag: avoid
  IDE von .org oder .cc besser geeignet? Bit of Byte 4 445 01.03.2016 21:57
Letzter Beitrag: arduinopeter
  Pretzelboard oder C.Control Warmbronner 1 527 22.02.2016 20:14
Letzter Beitrag: hotsystems
  AKtuelle Uhrzeit bekommen, RTC oder DFC-Empfänger Cray-1 34 15.510 11.02.2016 23:49
Letzter Beitrag: hotsystems
  Hardware Zähler MasT3r-A 4 521 24.01.2016 21:33
Letzter Beitrag: ardu_arne
  digitalOutputpin mit Taster an- oder ausschalten Raptor 2 565 26.12.2015 20:59
Letzter Beitrag: torsten_156
  Code Server oder Client seitig?? SchwesterStefan 3 566 09.11.2015 22:47
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste