MrMiffy08
01.01.2014, 23:44
Hallo Community,
ich brauche mal wieder Hilfe. Ich habe mir eine DC Motorsteuerung zurechgefummelt, aus einem Uno R3, einem RN Mini-Motorshield (http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=65&products_id=90) und einem Keypad-Aufsatz (http://www.sainsmart.com/sainsmart-1602-lcd-keypad-shield-for-arduino-duemilanove-uno-mega2560-mega1280.html) von Sainsmart. Der Sketch funktioniert soweit, bis auf die up/down - Zählerei. Mit den Tasten auf dem Keypad funktioniert die rechts-Linkssteuerung des Motors, nur die Routine mit
case UP_KEY:
SollSpeed = (SollSpeed+10);
break;
case DOWN_KEY:
SollSpeed = (SollSpeed-10);
break;
will einfach nicht, da passiert nichts. Wahrscheinlich hab ich mal wieder einen Hänger, aber ich seh einfach nicht wo. Die Keypad Abfrage ist eine Mod., die Library dazu stammt von Phaiax (https://github.com/Phaiax/sainsmartkeypad).
Habt Ihr Tipps für mich wo ich anfangen kann was zu ändern, damit das so funktioniert wie es soll?
Vielen Dank!
Der vollständige Code:
// modified from: http://itp.nyu.edu/physcomp/Labs/DCMotorControl
// erster Versuch, einen motor an der RN-mini-Motor-Bridge erst mal zum Drehen zu bringen
// funktioniert sogar, wenn auch nur mit poti...
// hier fehlt noch der Drehencoder - kommt später
// Achtung, das LiquidCrystal braucht die Pins (8, 9, 4, 5, 6, 7), auch 10, 12, 13
// der Encoder 2, 3 für A & B und die 1 für den Switch, ist alles n.n implementiert....
// bleiben noch Pin A1=15 fürs Poti, 3 für die PWM, A3=17, A4=18 für Motor In A und B und A5=19 für Enable sowie 0 (frei)
/* Phaiax Sainsmart LCD keypad shield - code returns the following variables:
UP_KEY
DOWN_KEY
RIGHT_KEY
LEFT_KEY
SELECT_KEY
*/
#include <avr/interrupt.h>
#include <avr/io.h>
#include "Arduino.h"
#include "LiquidCrystal.h"
#include "sainsmartkeypad.h" //from phaiax' example
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SainsmartKeypad keypad(0);
uint8_t key;
const int switchPin = 1; // switch input, switch to gnd
const int motor1_IN_A = 17; // H-bridge leg 1A = A3
const int motor1_IN_B = 18; // H-bridge leg 1B = A4
const int enablePin = 19; // H-bridge enable pin Enable A+B = A5
const int PWM_Pin = 3; // PWM Output = must be on Pin 3, 10 oder 11!
const int SollSpeedPin = A2; // Poti-Pin: Sollwert für Geschwindigkeit
int SollSpeed = 0; // Eingelesene Sollgeschwindigkeit, Startwert
void motor_stop() {
// put motor back to a safe 'LOW'
digitalWrite(motor1_IN_A, LOW);
digitalWrite(motor1_IN_B, LOW);
}
void setup() {
TCCR2B = (TCCR2B & 0xF8) | 6; // PWM Port setzen
pinMode(PWM_Pin, OUTPUT);
pinMode(switchPin, INPUT);
// set all the other pins you're using as outputs:
pinMode(motor1_IN_A, OUTPUT);
pinMode(motor1_IN_B, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(SollSpeedPin, INPUT);
digitalWrite(enablePin, LOW); //Pull-down für den enable-pin
digitalWrite(switchPin, HIGH); //Pull-up, der Switch zieht ihn auf low
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Poti - PWM -");
lcd.setCursor(0,1);
lcd.print("Motor-Test:");
delay(3000);
}
// in der loop soll der Motor mit eingestellter pwm laufen, dir kommt später
void loop() {
// Sollwert einlesen:
SollSpeed = analogRead(SollSpeedPin) / 5; // Ausgabe der PWM
analogWrite(PWM_Pin, SollSpeed);
// LCD-Ausgabe von Text und Soll-Speed:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Poti - PWM");
lcd.setCursor(0,1);
lcd.print("Speed:");
lcd.setCursor(8,1);
lcd.print(SollSpeed);
delay(100);
// Hier kommt die mod. Lib. von Phaiax zum Zug - die das Keypad besser ausliest.
key = keypad.getKey_fastscroll();
if(key != SAMPLE_WAIT) // Do not refresh screen every loop
{
switch(key)
{
case SELECT_KEY:
motor_stop();
break;
case UP_KEY:
SollSpeed = (SollSpeed+10);
break;
case DOWN_KEY:
SollSpeed = (SollSpeed-10);
break;
case RIGHT_KEY:
digitalWrite(enablePin, HIGH); // if the switch is pressed/low, motor will turn in one direction:
analogWrite(PWM_Pin, SollSpeed);
digitalWrite(motor1_IN_A, LOW); // set leg 1 of the H-bridge low
digitalWrite(motor1_IN_B, HIGH); // set leg 2 of the H-bridge high
break;
case LEFT_KEY:
analogWrite(PWM_Pin, SollSpeed);
digitalWrite(enablePin, HIGH);
digitalWrite(motor1_IN_A, HIGH); // set leg 1 of the H-bridge high
digitalWrite(motor1_IN_B, LOW); // set leg 2 of the H-bridge low
break;
}
lcd.setCursor(5,1);
lcd.print("Speed: ");
lcd.print(SollSpeed);
lcd.print(" ");
}
}
[/QUOTE]
und die keypad-Lib im Anhang.....
- - - Aktualisiert - - -
So, ich hab nochmal umgestellt, so dass der Sollwert auch eingelesen wird. Aber: Da zuckt der Motor nur mal kurz mit dem höheren/niedrigeren Wert, und in der nächsten loop ist natürlich wieder der Wert vom Poti drin. Wie macht man das, dass der neue Wert übernommen wird?
Der aktuelle Code:
[QUOTE]// modified from: http://itp.nyu.edu/physcomp/Labs/DCMotorControl
// erster Versuch, einen motor an der RN-mini-Motor-Bridge erst mal zum Drehen zu bringen
// funktioniert sogar, wenn auch nur mit poti...
// hier fehlt noch der Drehencoder - kommt später
// Achtung, das LiquidCrystal braucht die Pins (8, 9, 4, 5, 6, 7), auch 10, 12, 13
// der Encoder 2, 3 für A & B und die 1 für den Switch, ist alles n.n implementiert....
// bleiben noch Pin A1=15 fürs Poti, 3 für die PWM, A3=17, A4=18 für Motor In A und B und A5=19 für Enable sowie 0 (frei)
/* Sainsmart LCD keypad shield - code returns the following variables:
UP_KEY
DOWN_KEY
RIGHT_KEY
LEFT_KEY
SELECT_KEY
*/
#include <avr/interrupt.h>
#include <avr/io.h>
#include "Arduino.h"
#include "LiquidCrystal.h"
#include "sainsmartkeypad.h" //from phaiax' example
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SainsmartKeypad keypad(0);
uint8_t key;
const int switchPin = 1; // switch input, switch to gnd
const int motor1_IN_A = 17; // H-bridge leg 1A = A3
const int motor1_IN_B = 18; // H-bridge leg 1B = A4
const int enablePin = 19; // H-bridge enable pin Enable A+B = A5
const int PWM_Pin = 3; // PWM Output = must be on Pin 3, 10 oder 11!
const int SollSpeedPin = A2; // Poti-Pin: Sollwert für Geschwindigkeit
int SollSpeed = 0; // Eingelesene Sollgeschwindigkeit, Startwert
void motor_stop() {
// And put is all back to a safe 'LOW'
digitalWrite(motor1_IN_A, LOW);
digitalWrite(motor1_IN_B, LOW);
}
void motor_up() {
// And put the pwm up with 10
SollSpeed = SollSpeed+10;
}
// And put the pwm down with 10
void motor_down() {
SollSpeed = SollSpeed-10;
}
void setup() {
TCCR2B = (TCCR2B & 0xF8) | 6; // PWM Port setzen, Teiler02 : 8 : 3980 kHz
pinMode(PWM_Pin, OUTPUT);
pinMode(switchPin, INPUT);
// set all the other pins you're using as outputs:
pinMode(motor1_IN_A, OUTPUT);
pinMode(motor1_IN_B, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(SollSpeedPin, INPUT);
digitalWrite(enablePin, LOW); //Pull-down für den enable-pin
digitalWrite(switchPin, HIGH); //Pull-up, der Switch zieht ihn auf low
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Poti - PWM -");
lcd.setCursor(0,1);
lcd.print("Motor-Test:");
delay(3000);
}
// in der loop soll der Motor mit eingestellter pwm laufen, dir kommt später
void loop() {
// Sollwert einlesen:
SollSpeed = analogRead(SollSpeedPin) / 5; // Ausgabe der PWM
// Hier kommt die mod. Lib. von Phaiax zum Zug - die das Keypad besser ausliest als das Original
key = keypad.getKey_fastscroll();
if(key != SAMPLE_WAIT) // Do not refresh screen every loop
{
switch(key)
{
case SELECT_KEY:
motor_stop();
break;
case UP_KEY:
motor_up();
break;
case DOWN_KEY:
motor_down();
break;
case RIGHT_KEY:
digitalWrite(enablePin, HIGH); // if the switch is pressed/low, motor will turn in one direction:
analogWrite(PWM_Pin, SollSpeed);
digitalWrite(motor1_IN_A, LOW); // set leg 1 of the H-bridge low
digitalWrite(motor1_IN_B, HIGH); // set leg 2 of the H-bridge high
break;
case LEFT_KEY:
analogWrite(PWM_Pin, SollSpeed);
digitalWrite(enablePin, HIGH);
digitalWrite(motor1_IN_A, HIGH); // set leg 1 of the H-bridge high
digitalWrite(motor1_IN_B, LOW); // set leg 2 of the H-bridge low
break;
}
}
// hier wird der Sollwert an die PWM übergeben
analogWrite(PWM_Pin, SollSpeed);
// LCD-Ausgabe von Text und Soll-Speed:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Poti - PWM");
lcd.setCursor(0,1);
lcd.print("Speed:");
lcd.setCursor(8,1);
lcd.print(SollSpeed);
delay(100);
lcd.setCursor(5,1);
lcd.print("Speed: ");
lcd.print(SollSpeed);
lcd.print(" ");
}
ich brauche mal wieder Hilfe. Ich habe mir eine DC Motorsteuerung zurechgefummelt, aus einem Uno R3, einem RN Mini-Motorshield (http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=65&products_id=90) und einem Keypad-Aufsatz (http://www.sainsmart.com/sainsmart-1602-lcd-keypad-shield-for-arduino-duemilanove-uno-mega2560-mega1280.html) von Sainsmart. Der Sketch funktioniert soweit, bis auf die up/down - Zählerei. Mit den Tasten auf dem Keypad funktioniert die rechts-Linkssteuerung des Motors, nur die Routine mit
case UP_KEY:
SollSpeed = (SollSpeed+10);
break;
case DOWN_KEY:
SollSpeed = (SollSpeed-10);
break;
will einfach nicht, da passiert nichts. Wahrscheinlich hab ich mal wieder einen Hänger, aber ich seh einfach nicht wo. Die Keypad Abfrage ist eine Mod., die Library dazu stammt von Phaiax (https://github.com/Phaiax/sainsmartkeypad).
Habt Ihr Tipps für mich wo ich anfangen kann was zu ändern, damit das so funktioniert wie es soll?
Vielen Dank!
Der vollständige Code:
// modified from: http://itp.nyu.edu/physcomp/Labs/DCMotorControl
// erster Versuch, einen motor an der RN-mini-Motor-Bridge erst mal zum Drehen zu bringen
// funktioniert sogar, wenn auch nur mit poti...
// hier fehlt noch der Drehencoder - kommt später
// Achtung, das LiquidCrystal braucht die Pins (8, 9, 4, 5, 6, 7), auch 10, 12, 13
// der Encoder 2, 3 für A & B und die 1 für den Switch, ist alles n.n implementiert....
// bleiben noch Pin A1=15 fürs Poti, 3 für die PWM, A3=17, A4=18 für Motor In A und B und A5=19 für Enable sowie 0 (frei)
/* Phaiax Sainsmart LCD keypad shield - code returns the following variables:
UP_KEY
DOWN_KEY
RIGHT_KEY
LEFT_KEY
SELECT_KEY
*/
#include <avr/interrupt.h>
#include <avr/io.h>
#include "Arduino.h"
#include "LiquidCrystal.h"
#include "sainsmartkeypad.h" //from phaiax' example
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SainsmartKeypad keypad(0);
uint8_t key;
const int switchPin = 1; // switch input, switch to gnd
const int motor1_IN_A = 17; // H-bridge leg 1A = A3
const int motor1_IN_B = 18; // H-bridge leg 1B = A4
const int enablePin = 19; // H-bridge enable pin Enable A+B = A5
const int PWM_Pin = 3; // PWM Output = must be on Pin 3, 10 oder 11!
const int SollSpeedPin = A2; // Poti-Pin: Sollwert für Geschwindigkeit
int SollSpeed = 0; // Eingelesene Sollgeschwindigkeit, Startwert
void motor_stop() {
// put motor back to a safe 'LOW'
digitalWrite(motor1_IN_A, LOW);
digitalWrite(motor1_IN_B, LOW);
}
void setup() {
TCCR2B = (TCCR2B & 0xF8) | 6; // PWM Port setzen
pinMode(PWM_Pin, OUTPUT);
pinMode(switchPin, INPUT);
// set all the other pins you're using as outputs:
pinMode(motor1_IN_A, OUTPUT);
pinMode(motor1_IN_B, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(SollSpeedPin, INPUT);
digitalWrite(enablePin, LOW); //Pull-down für den enable-pin
digitalWrite(switchPin, HIGH); //Pull-up, der Switch zieht ihn auf low
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Poti - PWM -");
lcd.setCursor(0,1);
lcd.print("Motor-Test:");
delay(3000);
}
// in der loop soll der Motor mit eingestellter pwm laufen, dir kommt später
void loop() {
// Sollwert einlesen:
SollSpeed = analogRead(SollSpeedPin) / 5; // Ausgabe der PWM
analogWrite(PWM_Pin, SollSpeed);
// LCD-Ausgabe von Text und Soll-Speed:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Poti - PWM");
lcd.setCursor(0,1);
lcd.print("Speed:");
lcd.setCursor(8,1);
lcd.print(SollSpeed);
delay(100);
// Hier kommt die mod. Lib. von Phaiax zum Zug - die das Keypad besser ausliest.
key = keypad.getKey_fastscroll();
if(key != SAMPLE_WAIT) // Do not refresh screen every loop
{
switch(key)
{
case SELECT_KEY:
motor_stop();
break;
case UP_KEY:
SollSpeed = (SollSpeed+10);
break;
case DOWN_KEY:
SollSpeed = (SollSpeed-10);
break;
case RIGHT_KEY:
digitalWrite(enablePin, HIGH); // if the switch is pressed/low, motor will turn in one direction:
analogWrite(PWM_Pin, SollSpeed);
digitalWrite(motor1_IN_A, LOW); // set leg 1 of the H-bridge low
digitalWrite(motor1_IN_B, HIGH); // set leg 2 of the H-bridge high
break;
case LEFT_KEY:
analogWrite(PWM_Pin, SollSpeed);
digitalWrite(enablePin, HIGH);
digitalWrite(motor1_IN_A, HIGH); // set leg 1 of the H-bridge high
digitalWrite(motor1_IN_B, LOW); // set leg 2 of the H-bridge low
break;
}
lcd.setCursor(5,1);
lcd.print("Speed: ");
lcd.print(SollSpeed);
lcd.print(" ");
}
}
[/QUOTE]
und die keypad-Lib im Anhang.....
- - - Aktualisiert - - -
So, ich hab nochmal umgestellt, so dass der Sollwert auch eingelesen wird. Aber: Da zuckt der Motor nur mal kurz mit dem höheren/niedrigeren Wert, und in der nächsten loop ist natürlich wieder der Wert vom Poti drin. Wie macht man das, dass der neue Wert übernommen wird?
Der aktuelle Code:
[QUOTE]// modified from: http://itp.nyu.edu/physcomp/Labs/DCMotorControl
// erster Versuch, einen motor an der RN-mini-Motor-Bridge erst mal zum Drehen zu bringen
// funktioniert sogar, wenn auch nur mit poti...
// hier fehlt noch der Drehencoder - kommt später
// Achtung, das LiquidCrystal braucht die Pins (8, 9, 4, 5, 6, 7), auch 10, 12, 13
// der Encoder 2, 3 für A & B und die 1 für den Switch, ist alles n.n implementiert....
// bleiben noch Pin A1=15 fürs Poti, 3 für die PWM, A3=17, A4=18 für Motor In A und B und A5=19 für Enable sowie 0 (frei)
/* Sainsmart LCD keypad shield - code returns the following variables:
UP_KEY
DOWN_KEY
RIGHT_KEY
LEFT_KEY
SELECT_KEY
*/
#include <avr/interrupt.h>
#include <avr/io.h>
#include "Arduino.h"
#include "LiquidCrystal.h"
#include "sainsmartkeypad.h" //from phaiax' example
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SainsmartKeypad keypad(0);
uint8_t key;
const int switchPin = 1; // switch input, switch to gnd
const int motor1_IN_A = 17; // H-bridge leg 1A = A3
const int motor1_IN_B = 18; // H-bridge leg 1B = A4
const int enablePin = 19; // H-bridge enable pin Enable A+B = A5
const int PWM_Pin = 3; // PWM Output = must be on Pin 3, 10 oder 11!
const int SollSpeedPin = A2; // Poti-Pin: Sollwert für Geschwindigkeit
int SollSpeed = 0; // Eingelesene Sollgeschwindigkeit, Startwert
void motor_stop() {
// And put is all back to a safe 'LOW'
digitalWrite(motor1_IN_A, LOW);
digitalWrite(motor1_IN_B, LOW);
}
void motor_up() {
// And put the pwm up with 10
SollSpeed = SollSpeed+10;
}
// And put the pwm down with 10
void motor_down() {
SollSpeed = SollSpeed-10;
}
void setup() {
TCCR2B = (TCCR2B & 0xF8) | 6; // PWM Port setzen, Teiler02 : 8 : 3980 kHz
pinMode(PWM_Pin, OUTPUT);
pinMode(switchPin, INPUT);
// set all the other pins you're using as outputs:
pinMode(motor1_IN_A, OUTPUT);
pinMode(motor1_IN_B, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(SollSpeedPin, INPUT);
digitalWrite(enablePin, LOW); //Pull-down für den enable-pin
digitalWrite(switchPin, HIGH); //Pull-up, der Switch zieht ihn auf low
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Poti - PWM -");
lcd.setCursor(0,1);
lcd.print("Motor-Test:");
delay(3000);
}
// in der loop soll der Motor mit eingestellter pwm laufen, dir kommt später
void loop() {
// Sollwert einlesen:
SollSpeed = analogRead(SollSpeedPin) / 5; // Ausgabe der PWM
// Hier kommt die mod. Lib. von Phaiax zum Zug - die das Keypad besser ausliest als das Original
key = keypad.getKey_fastscroll();
if(key != SAMPLE_WAIT) // Do not refresh screen every loop
{
switch(key)
{
case SELECT_KEY:
motor_stop();
break;
case UP_KEY:
motor_up();
break;
case DOWN_KEY:
motor_down();
break;
case RIGHT_KEY:
digitalWrite(enablePin, HIGH); // if the switch is pressed/low, motor will turn in one direction:
analogWrite(PWM_Pin, SollSpeed);
digitalWrite(motor1_IN_A, LOW); // set leg 1 of the H-bridge low
digitalWrite(motor1_IN_B, HIGH); // set leg 2 of the H-bridge high
break;
case LEFT_KEY:
analogWrite(PWM_Pin, SollSpeed);
digitalWrite(enablePin, HIGH);
digitalWrite(motor1_IN_A, HIGH); // set leg 1 of the H-bridge high
digitalWrite(motor1_IN_B, LOW); // set leg 2 of the H-bridge low
break;
}
}
// hier wird der Sollwert an die PWM übergeben
analogWrite(PWM_Pin, SollSpeed);
// LCD-Ausgabe von Text und Soll-Speed:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Poti - PWM");
lcd.setCursor(0,1);
lcd.print("Speed:");
lcd.setCursor(8,1);
lcd.print(SollSpeed);
delay(100);
lcd.setCursor(5,1);
lcd.print("Speed: ");
lcd.print(SollSpeed);
lcd.print(" ");
}