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(" ");
}
Lesezeichen