Arduino Uno + Motor Shield + Lcd Keypad Shield Stromversorgung?

Hallo zusammen, ich baue gerade einen Timelpase Slider mit folgenden Elementen: - Arduino Uno - Adafruit Motor Shield v2.3 - KW Mobile Lcd Keypad Shield - NEMA 17 Schrittmotor - 1200 mAh 7,2V LiPo Akku aus dem Modellbau

Beim starten des Sketches (ich benutze die Adafruit Motor shield Library) fängt die Power Led des Motor Shields an zu blinken. Kurz darauf wird dieses Blinken durch ein Klicken des Motors fortgesetzt und ein wenig später hört dann der Motor auf, sich zu drehen (man merkt eine Aktion, aber die Welle dreht sich nicht). Der Akku ist voll aufgeladen.

Woran kann das liegen?

Mfg, Linus

Könntest Du uns das Verdrahtungsschema posten? Und den vollständigen Code des Sketches? Meine Vermutung ist, dass die Stromversorgung zusammenbricht. Die 7.2V des Akkus sind zu wenig für den NEMA 17, der ist für 12V ausgelegt. Wenn die Versorgung des Motor-Shields über den Arduino passiert, dürfte die Sicherung anspringen, was im Blinken der Power-LED enden kann. Das ist Spekulation, da Du viel zu wenig über Deinen Aufbau verraten hast.

Danke für die schnelle Antwort!

Die Shields sind mit Stacking Headern aufeinander gesteckt, der Akku geht über VIn in den Arduino und in beide Shields; Stromversorgung erfolgt also über Arduino.

Code:

/*+++++++++++++++++++++++++++++++++++++++++++++++++++
Author : Fahmi Ghani
Date : 5 July 2015
Project : LCD Menu Function
Component : LCD Keypad shield
Description : Simple Menu function on LCD
Button Function:
Up/Down - change Menu Page
Select - enter page
Left - Exit

Video Link: http://youtu.be/cMqif5ICS5M

+++++++++++++++++++++++++++++++++++++++++++++++++++*/
#include <Adafruit_MotorShield.h>
#include <LiquidCrystal.h>
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);
LiquidCrystal lcd(8,9,4,5,6,7);

int keypad_pin = A0;
int keypad_value = 0;
int keypad_value_old = 0;

int INTERVALL = 1;
int STEPS = 1;
int STEPSact = STEPS * 50;
int StepCount = 1;

char btn_push;

byte mainMenuPage = 1;
byte mainMenuPageOld = 1;
byte mainMenuTotal = 2; // Bei neuem Menüpunkt +1

byte Line[8] = {
0b00100,
0b00000,
0b00000,
0b00100,
0b00000,
0b00000,
0b00100,
0b00000

};

void setup()
{
lcd.createChar(0, Line);
Serial.begin(9600); // set up Serial library at 9600 bps
AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz
pinMode(13, OUTPUT);
myMotor->setSpeed(5); // 5 rpm
lcd.begin(16,2); //Initialize a 2x16 type LCD

MainMenuDisplay();
delay(1000);
}
void loop()
{
btn_push = ReadKeypad();

MainMenuBtn();

if(btn_push == ‘U’)//enter selected menu
{
WaitBtnRelease();
switch (mainMenuPage)
{
case 1:
INTERVALL++;
break;
case 2:
STEPS++;
break;
}

MainMenuDisplay();
WaitBtnRelease();
}
if(btn_push == ‘D’)//enter selected menu
{
WaitBtnRelease();
switch (mainMenuPage)
{
case 1:
INTERVALL–;
break;
case 2:
STEPS–;
break;
}

MainMenuDisplay();
WaitBtnRelease();
}

delay(10);

}//--------------- End of loop() loop ---------------------
void Motor()
{
lcd.print(“RUNNING”);
lcd.setCursor(10, 0);
lcd.print(STEPS * 50);
lcd.print(" “);
lcd.print(INTERVALL);
lcd.print(“s”);
while(StepCount < STEPS * 50){
myMotor->step(8, BACKWARD, DOUBLE);
delay(300);
digitalWrite(13, LOW); // turn the LED on (HIGH is the voltage level)
Serial.println(”-");
delay(100); // wait for a second
digitalWrite(13, HIGH); // turn the LED off by making the voltage LOW
delay (INTERVALL * 1000 - 400);
StepCount++;
Serial.println(StepCount);
lcd.setCursor(4, 1);
lcd.print(StepCount);
lcd.print(" “);
lcd.print(”/");
lcd.print(" ");
lcd.print(STEPS * 50);
}
lcd.clear();
lcd.setCursor(3, 1);
lcd.print(“RESETTING”);
delay(1000);
lcd.clear();
mainMenuPage = 1;
StepCount = 0;
myMotor->setSpeed(50); // 5 rpm
myMotor->step(1600, FORWARD, DOUBLE);

}

void MainMenuDisplay()
{
lcd.clear();
lcd.setCursor(0,0);
switch (mainMenuPage)
{
case 1:
lcd.setCursor(1, 0);
lcd.print(“INTERVALL”);
lcd.setCursor(2, 1);
lcd.print(INTERVALL);
lcd.print(“s”);

lcd.setCursor(11, 0);
lcd.write((byte)0);
lcd.setCursor(11, 1);
lcd.write((byte)0);
lcd.setCursor(13, 0);
lcd.print(“STP”);
lcd.setCursor(13, 1);
lcd.print(STEPS * 50);

break;
case 2:
lcd.setCursor(1, 0);
lcd.print(“STEPS”);
lcd.setCursor(2, 1);
lcd.print(STEPS * 50);

lcd.setCursor(11, 0);
lcd.write((byte)0);
lcd.setCursor(11, 1);
lcd.write((byte)0);
lcd.setCursor(13, 0);
lcd.print(“INT”);
lcd.setCursor(13, 1);
lcd.print(INTERVALL);
lcd.print(“s”);
break;
case 3:
Motor();

}
}

void MainMenuBtn()
{
WaitBtnRelease();
if(btn_push == ‘R’)
{
mainMenuPage++;
if(mainMenuPage > 2)
mainMenuPage = 1;
}
else if(btn_push == ‘L’)
{
mainMenuPage–;
if(mainMenuPage == 0)
mainMenuPage = mainMenuTotal;
}
else if(btn_push == ‘S’)
{
mainMenuPage = 3;
}

if(mainMenuPage != mainMenuPageOld) //only update display when page change
{
MainMenuDisplay();
mainMenuPageOld = mainMenuPage;
}
}

char ReadKeypad()
{
/* Keypad button analog Value
no button pressed 1023
select 741
left 503
down 326
up 142
right 0
*/
keypad_value = analogRead(keypad_pin);

if(keypad_value < 100)
return ‘R’;
else if(keypad_value < 200)
return ‘U’;
else if(keypad_value < 400)
return ‘D’;
else if(keypad_value < 600)
return ‘L’;
else if(keypad_value < 800)
return ‘S’;
else
return ‘N’;

}

void WaitBtnRelease()
{
while( analogRead(keypad_pin) < 800){}
}

Hier ist wahrscheinlich vor allem void Motor() interessant; der Rest ist ja nur für das Menü auf dem Display.
Beste Grüße,
Linus

Bitte setze den Code in Codetags. Das kannst Du auch nachträglich noch ändern.
Entwerder </> oben links im Editierfenster oder [code] vor und [/code] nach dem Code einfügen. Ohne den *!
So ist er besser lesbar.

Gruß Tommy

Oh ok, muss mich hier auch erst mal einfinden :slight_smile:

/*+++++++++++++++++++++++++++++++++++++++++++++++++++
Author      : Fahmi Ghani
Date        : 5 July 2015 
Project     : LCD Menu Function
Component   : LCD Keypad shield
Description : Simple Menu function on LCD
              Button Function:
                Up/Down - change Menu Page
                Select - enter page
                Left - Exit

Video Link: http://youtu.be/cMqif5ICS5M

+++++++++++++++++++++++++++++++++++++++++++++++++++*/
#include <Adafruit_MotorShield.h>
#include <LiquidCrystal.h>
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);
LiquidCrystal lcd(8,9,4,5,6,7);  

int keypad_pin = A0;
int keypad_value = 0;
int keypad_value_old = 0;

int INTERVALL = 1;
int STEPS = 1; 
int STEPSact = STEPS * 50;
int StepCount = 1;

char btn_push;

byte mainMenuPage = 1;
byte mainMenuPageOld = 1;
byte mainMenuTotal = 2; // Bei neuem Menüpunkt +1

byte Line[8] = {
  0b00100,
  0b00000,
  0b00000,
  0b00100,
  0b00000,
  0b00000,
  0b00100,
  0b00000

};

void setup()
{
  lcd.createChar(0, Line);
  Serial.begin(9600);           // set up Serial library at 9600 bps
  AFMS.begin();  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz
   pinMode(13, OUTPUT); 
  myMotor->setSpeed(5);  // 5 rpm  
    lcd.begin(16,2);  //Initialize a 2x16 type LCD

    MainMenuDisplay();
    delay(1000);
}
void loop()
{
    btn_push = ReadKeypad();
    
    MainMenuBtn();
    
    if(btn_push == 'U')//enter selected menu
    {
        WaitBtnRelease();
        switch (mainMenuPage)
        {
            case 1:
              INTERVALL++;
              break;
            case 2:
              STEPS++;
              break;
        }

          MainMenuDisplay();
          WaitBtnRelease();
    }
     if(btn_push == 'D')//enter selected menu
    {
        WaitBtnRelease();
        switch (mainMenuPage)
        {
            case 1:
              INTERVALL--;
              break;
            case 2:
              STEPS--;
              break;
        }

          MainMenuDisplay();
          WaitBtnRelease();
    }
    


    delay(10);
  
}//--------------- End of loop() loop ---------------------
void Motor()
{
  lcd.print("RUNNING");
          lcd.setCursor(10, 0);
          lcd.print(STEPS * 50);
          lcd.print(" ");
          lcd.print(INTERVALL);
          lcd.print("s");
  while(StepCount < STEPS * 50){
  myMotor->step(8, BACKWARD, DOUBLE);
  delay(300);
  digitalWrite(13, LOW);   // turn the LED on (HIGH is the voltage level)
  Serial.println("-");
  delay(100);              // wait for a second
  digitalWrite(13, HIGH);    // turn the LED off by making the voltage LOW 
  delay (INTERVALL * 1000 - 400);
  StepCount++;
  Serial.println(StepCount);
  lcd.setCursor(4, 1);
          lcd.print(StepCount);
          lcd.print(" ");
          lcd.print("/");
          lcd.print(" ");
          lcd.print(STEPS * 50);
  }
  lcd.clear();
  lcd.setCursor(3, 1);
  lcd.print("RESETTING");
  delay(1000);
  lcd.clear();
 mainMenuPage = 1;
 StepCount = 0;
 myMotor->setSpeed(50);  // 5 rpm 
 myMotor->step(1600, FORWARD, DOUBLE);
 
}


void MainMenuDisplay()
{
    lcd.clear();
    lcd.setCursor(0,0);
    switch (mainMenuPage)
    {
        case 1: 
          lcd.setCursor(1, 0);
          lcd.print("INTERVALL");
          lcd.setCursor(2, 1);
          lcd.print(INTERVALL);
          lcd.print("s");

          lcd.setCursor(11, 0);
          lcd.write((byte)0);
          lcd.setCursor(11, 1);
          lcd.write((byte)0);
          lcd.setCursor(13, 0);
          lcd.print("STP");
          lcd.setCursor(13, 1);
          lcd.print(STEPS * 50);
          
          
          break;
        case 2:
          lcd.setCursor(1, 0);
          lcd.print("STEPS");
          lcd.setCursor(2, 1);
          lcd.print(STEPS * 50);

          lcd.setCursor(11, 0);
          lcd.write((byte)0);
          lcd.setCursor(11, 1);
          lcd.write((byte)0);
          lcd.setCursor(13, 0);
          lcd.print("INT");
          lcd.setCursor(13, 1);
          lcd.print(INTERVALL);
          lcd.print("s");
          break;
        case 3:
          Motor();
    
}
}

void MainMenuBtn()
{
    WaitBtnRelease();
    if(btn_push == 'R')
    {
        mainMenuPage++;
        if(mainMenuPage > 2)
          mainMenuPage = 1;
    }
    else if(btn_push == 'L')
    {
        mainMenuPage--;
        if(mainMenuPage == 0)
          mainMenuPage = mainMenuTotal;    
    }
    else if(btn_push == 'S')
    {
        mainMenuPage = 3;    
    }
    
    if(mainMenuPage != mainMenuPageOld) //only update display when page change
    {
        MainMenuDisplay();
        mainMenuPageOld = mainMenuPage;
    }
}

char ReadKeypad()
{
  /* Keypad button analog Value
  no button pressed 1023
  select  741
  left    503
  down    326
  up      142
  right   0 
  */
  keypad_value = analogRead(keypad_pin);
  
  if(keypad_value < 100)
    return 'R';
  else if(keypad_value < 200)
    return 'U';
  else if(keypad_value < 400)
    return 'D';
  else if(keypad_value < 600)
    return 'L';
  else if(keypad_value < 800)
    return 'S';
  else 
    return 'N';

}

void WaitBtnRelease()
{
    while( analogRead(keypad_pin) < 800){} 
}

Wir brauchen noch ein paar Infos zum Motor (am Besten einen Link). Nema 17 ist nur eine mechanische Baugröße.

Ich vermute auch, dass die Spannung zusammen bricht.

Gruß Tommy

Gerade nochmal geschaut. Der 5V Pin des UNO kann max. 200mA treiben. Da muss der Motor elektrisch schon sehr, sehr klein sein. Das LCD will ja auch noch versorgt sein und etwas braucht der UNO auch selbst :wink:

Also eher unwahrscheinlich, dass das funktioniert.

Gruß Tommy

Die Sicherung im UNO schaltet ab einem Strom von 500mA ab. Der UNO braucht sehr wenig (<100mA), das Display wahrscheinlich etwas mehr, aber trotzdem bleibt für den Motor fast nichts mehr übrig. Wenn Du die Akku-Spannung parallel noch an’s Motor-Shield anschliesst und den Versorgungs-Jumper entsprechend verbiegst, könntest Du evtl. knapp davon kommen.

LEORX NEMA 17 2 Phase 4-Draht 1.5A 40 mm 1,8 ° Schrittmotor für 3D Drucker Ich hab noch einen 8xAA Batterie-Halter. Den werde ich mal ausprobieren.

Du musst die Motoren extra versorgen, nicht über den Arduino. Das stemmt der nicht. Also nicht einfach andere Batterien dran. Ob die 8xAA das abgeben, weiß ich nicht, zumindest nicht lange.

Hast Du kein vernünftiges Netzteil?

Gruß Tommy

Ich meinte extra . Würde dann noch einen 9V Block an den Arduino hängen und das beides separieren. Da es ein Timelapse Slider (mobil; outdoor) ist, kommt ein Netzteil leider nicht in Frage

Sorry für die Ungenauigkeiten :-*

9V Block kannst Du knicken. Der hat kaum Kapazität. Zum AUsprobieren würde ich an Deiner Stelle trotzdem mal ein Netzteil versuchen, um die Batterien als Fehlerquelle auszuschließen.

Gruß Tommy

Hallo nochmal, Ich hab letzte Nacht die AA-Akkus geladen und heute damit separat nur das Motorshield mit den 8xAA Batterien und den Rest über den Usb-Anschluss des Arduino mit einem Netzteil betrieben. Und wieder passierte das gleiche. :slightly_frowning_face:

Ich bin mal wieder ratlos.

Hat das Motorshield einen eigen Spannungsanschluß, der nicht auf den Arduino geschaltet ist?

Gruß Tommy

Ja, den habe ich in diesem Beispiel verwendet.

Dann gibt es entweder noch einen Fehler oder die 8 AA bringen es auch nicht. Kannst Du die Motoren mal an einem etwas belastbaren Netzteil betreiben?

Gruß Tommy

Schrittmotor: 1.3A, 2.4V Adafruit Motor Shield V2: 1.2A, 4.5V to 13.5V

Das paßt nicht zusammen.

Hast Du den Jumper umgesteckt? Denn sonst wird der separate Stromanschluss nicht verwendet und weiterhin der Strom vom Arduino genommen.

pylon: Hast Du den Jumper umgesteckt? Denn sonst wird der separate Stromanschluss nicht verwendet und weiterhin der Strom vom Arduino genommen.

Ja hab ich.

Hab grad spaßeshalber ein 4xAA Pack (ca. 4,5V) für das Motorshield und wieder ein Usb-Netzteil für den Arduino probiert, welches erstaunlicherweise einwandfrei funktionierte :o Könnte man dann, da die 4,5v funktionieren vielleicht mit einem Voltage Booster den 7,2v Akku auf 4,5v runterregeln? Das müsste doch dann auch klappen.

4xAA müsste etwas in der Region von 6V ergeben, bei Akkus etwas weniger. Da die Spannung dann etwas tiefer ist als die Versorgungsspannung des Arduinos würde das meine Vermutung bekräftigen, dass der Versorgungs-Power-Jumper immer noch installiert ist und somit die Versorgung des Shields über Vin auch auf den Arduino geht. Wenn dann der Motor startet, fällt die Spannung der Batterie ab, der Arduino schaltet über den FET auf USB-Power und startet neu, weil der Strom kurz weg war.

Da mit dem neuen Pack die Spannung von Anfang an tiefer ist, wird der Arduino immer über das Netzteil versorgt und bleibt stabil.

Kannst Du das nochmals überprüfen?