Yves Ehrlich
5 years ago
5 changed files with 362 additions and 0 deletions
-
155Code/miniRobot/miniRobot.ino
-
115Code/miniRobotRC/_main.ino
-
6Code/miniRobotRC/funkInit.ino
-
68Code/miniRobotRC/miniRobotRC.ino
-
18Code/miniRobotRC/remoteControlInit.ino
@ -0,0 +1,155 @@ |
|||
/*
|
|||
* modularer Mini Roboter mit diversen Sensoren |
|||
* |
|||
* |
|||
*/ |
|||
//Funk
|
|||
#include <SPI.h>
|
|||
#include <nRF24L01.h>
|
|||
#include <RF24.h>
|
|||
#define CE A0
|
|||
#define CSN 3
|
|||
RF24 radio(A0, 3); // CE, CSN
|
|||
|
|||
byte commands[32]; //byte 0 = command
|
|||
|
|||
void inline clearCommands() { |
|||
for(uint8_t i=0; i<32; i++) { |
|||
commands[i] = 0xFF; |
|||
} |
|||
} |
|||
|
|||
const byte address[6] = "00001"; |
|||
//Kommandos
|
|||
#define nothing 9 //reset/nichts tun
|
|||
#define speedA 1 // set speed A + speed
|
|||
#define dirA 2 // set direction A + dir
|
|||
#define speedB 3 // set speed B + speed
|
|||
#define dirB 4 // set direction B + dir
|
|||
#define goDrive 5 //go + time to go
|
|||
#define stopDrive 6 //stop
|
|||
#define getTemp 7 //get temperature
|
|||
#define timeToDrive 8 //Zeitdauer des fahrens
|
|||
//Motortreiber
|
|||
//#include <MX1508.h>
|
|||
#include <L298N.h>
|
|||
|
|||
#define BEEP 14
|
|||
|
|||
#define PWM_PINA 10
|
|||
#define PINA 8
|
|||
#define PWM_PINB 9
|
|||
#define PINB 7
|
|||
#define NUMPWM 1
|
|||
|
|||
#define RESOLUTION 255
|
|||
|
|||
//MX1508 motorA(PWM_PINA,PINA, FAST_DECAY, NUMPWM);
|
|||
//MX1508 motorB(PWM_PINB,PINB, FAST_DECAY, NUMPWM);
|
|||
L298N drive; |
|||
|
|||
|
|||
volatile int pwmA = 0; |
|||
volatile int pwmB = 0; |
|||
bool forwardA = true; |
|||
bool forwardB = true; |
|||
volatile bool driveOn = false; |
|||
|
|||
int temperatur = 0; |
|||
|
|||
|
|||
volatile long driveTimeout = 0; |
|||
volatile long driveTimeDiff = 0; |
|||
|
|||
void setup() { |
|||
Serial.begin(115200); |
|||
// motorA.setPWM16(2,RESOLUTION);
|
|||
// motorB.setPWM16(2,RESOLUTION);
|
|||
radio.begin(); |
|||
radio.openReadingPipe(0, address); |
|||
radio.setPALevel(RF24_PA_MAX); |
|||
radio.startListening(); |
|||
clearCommands(); |
|||
} |
|||
|
|||
void loop() { |
|||
if (radio.available()) { |
|||
radio.read(&commands, sizeof(commands)); |
|||
commandInterpretation(); |
|||
} |
|||
//Serial.println(driveOn);
|
|||
if(((millis() - driveTimeDiff) > driveTimeout)) { |
|||
pwmA = 0; |
|||
pwmB = 0; |
|||
} |
|||
drive.setPWM_A(pwmA); |
|||
drive.setPWM_B(pwmB); |
|||
} |
|||
|
|||
void commandInterpretation() { |
|||
for(uint8_t i = 0; i < 28; i += 3) { |
|||
switch(commands[i]) { |
|||
case nothing : { |
|||
pwmA = 0; |
|||
pwmB = 0; |
|||
forwardA = true; |
|||
forwardB = true; |
|||
driveOn = false; |
|||
break; |
|||
} |
|||
case speedA : { |
|||
int temp1; |
|||
temp1 = (0xFF00 & (commands[i+1] << 8)); |
|||
temp1 |= (0x00FF & commands[i+2]); |
|||
pwmA = temp1; |
|||
break; |
|||
} |
|||
case dirA : { |
|||
bool temp2 = commands[i+2]; |
|||
break; |
|||
} |
|||
case speedB : { |
|||
int temp3; |
|||
temp3 = (0xFF00 & (commands[i+1] << 8)); |
|||
temp3 |= (0x00FF & commands[i+2]); |
|||
pwmB = temp3; |
|||
break; |
|||
} |
|||
case dirB : { |
|||
bool temp4; |
|||
temp4 = commands[i+2]; |
|||
break; |
|||
} |
|||
case goDrive : { |
|||
driveOn = true; |
|||
break; |
|||
} |
|||
case stopDrive : { |
|||
driveOn = false; |
|||
break; |
|||
} |
|||
case getTemp : { |
|||
temperatur = (0xFF00 & (commands[i+1] << 8)); |
|||
temperatur |= (0x00FF & commands[i+2]); |
|||
break; |
|||
} |
|||
case timeToDrive : { |
|||
uint16_t driveTime = 0; |
|||
driveTime = (0xFF00 & (commands[i+1] << 8)); |
|||
driveTime |= (0x00FF & commands[i+2]); |
|||
driveTimeout = (long)driveTime; |
|||
driveTimeDiff = millis(); |
|||
Serial.println(driveTimeout); |
|||
break; |
|||
} |
|||
default : { /* pwmA = 0;
|
|||
pwmB = 0; |
|||
forwardA = true; |
|||
forwardB = true; |
|||
driveOn = false; */ |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
clearCommands(); |
|||
} |
@ -0,0 +1,115 @@ |
|||
#include <avr/interrupt.h>
|
|||
#include <avr/io.h>
|
|||
#include <Arduino.h>
|
|||
|
|||
void inline clearCommands() { |
|||
for(uint8_t i=0; i<32; i++) { |
|||
commands[i] = 0xFF; |
|||
} |
|||
} |
|||
|
|||
void setup() { |
|||
remoteControlInit(); |
|||
funkInit(); |
|||
Serial.begin(115200); |
|||
driveTimeout = 50; |
|||
/*
|
|||
commands[0] = speedA; |
|||
commands[1] = 0xFF & (pwmA >> 8); |
|||
commands[2] = 0xFF & pwmA; |
|||
|
|||
commands[3] = speedB; |
|||
commands[4] = 0xFF & (pwmB >> 8); |
|||
commands[5] = 0xFF & pwmB; |
|||
|
|||
commands[6] = goDrive; |
|||
|
|||
commands[9] = timeToDrive; |
|||
commands[10] = 0xFF & (driveTimeout >> 8); |
|||
commands[11] = 0xFF & driveTimeout; */ |
|||
clearCommands(); |
|||
} |
|||
|
|||
void loop() { |
|||
//char text[32] = "Hello";
|
|||
// radio.write(&commands, sizeof(commands));
|
|||
//lcdMenu();
|
|||
//delay(10000);
|
|||
manualDrive(); |
|||
} |
|||
|
|||
void lcdMenu() { |
|||
lcd.println("Platzhalter"); |
|||
|
|||
if(tasten.getButtonCycle(buttonUp)) { |
|||
|
|||
tasten.clearAllButtons(); |
|||
} |
|||
if(tasten.getButtonCycle(buttonDown)) { |
|||
|
|||
tasten.clearAllButtons(); |
|||
} |
|||
|
|||
} |
|||
|
|||
void manualDrive() { |
|||
bool goOn = false; |
|||
while(!tasten.getButtonCycle(buttonStart)) { |
|||
clearCommands(); |
|||
if(!tasten.getAnyPressed()) { |
|||
lcd.clear(); |
|||
lcd.println("Warte..."); |
|||
} |
|||
if(tasten.checkButton(buttonB) || tasten.checkButton(buttonUp)) { |
|||
pwmA = -215; |
|||
pwmB = -255; |
|||
// tasten.clearButton(buttonB);
|
|||
lcd.clear(); |
|||
lcd.println("geradeaus fahren"); |
|||
goOn =true; |
|||
} |
|||
if(tasten.checkButton(buttonC) || tasten.checkButton(buttonDown)) { |
|||
pwmA = 100; |
|||
pwmB = 255; |
|||
// tasten.clearButton(buttonC);
|
|||
lcd.clear(); |
|||
lcd.println("rueckwaerts fahren"); |
|||
goOn =true; |
|||
} |
|||
if(tasten.checkButton(buttonRight)) { |
|||
pwmA = -100; //rechter Motor
|
|||
pwmB = 100; |
|||
//tasten.clearButton(buttonRight);
|
|||
lcd.clear(); |
|||
lcd.println("rechts lenken"); |
|||
goOn =true; |
|||
} |
|||
if(tasten.checkButton(buttonLeft)) { |
|||
pwmB = -100; |
|||
pwmA = 100; |
|||
//tasten.clearButton(buttonLeft);
|
|||
lcd.clear(); |
|||
lcd.println("links lenken"); |
|||
goOn =true; |
|||
} |
|||
if(goOn) { |
|||
commands[0] = speedA; |
|||
commands[1] = highByte(pwmA); |
|||
commands[2] = lowByte(pwmA); |
|||
commands[3] = speedB; |
|||
commands[4] = highByte(pwmB); |
|||
commands[5] = lowByte(pwmB); |
|||
commands[6] = timeToDrive; |
|||
commands[7] = highByte(driveTimeout); |
|||
commands[8] = lowByte(driveTimeout); |
|||
commands[9] = goDrive; |
|||
radio.write(&commands, sizeof(commands)); |
|||
goOn = false; |
|||
} |
|||
} |
|||
tasten.clearAllButtons(); |
|||
} |
|||
|
|||
ISR(TIMER2_COMPA_vect) { // called by timer2
|
|||
tasten.checkButtons(); //Aufruf 1-mal pro Millisekunde
|
|||
} |
@ -0,0 +1,6 @@ |
|||
void funkInit() { |
|||
radio.begin(); |
|||
radio.openWritingPipe(address); |
|||
radio.setPALevel(RF24_PA_MAX); |
|||
radio.stopListening(); |
|||
} |
@ -0,0 +1,68 @@ |
|||
//template
|
|||
#include <PCD8544_SPI.h>
|
|||
#include <shiftRegButtonLib.h>
|
|||
#include <myInterrupts.h>
|
|||
|
|||
#define CLR_BIT(p,n) ((p) &= ~((1) << (n)))
|
|||
#define SET_BIT(p,n) ((p) |= (1 << (n)))
|
|||
|
|||
#define BL 10 //backlight, Hintergrundbeleuchtung LCD
|
|||
#define SD_CARD_CS 2 //D2 ist Chip Enable
|
|||
#define BAT_VOLTAGE A7 //Akkuspannung an A7
|
|||
#define _OE_LEVEL 7 //D7 fuer Output Enable Pegelwandler
|
|||
#define BRIGHTNESS OCR1B
|
|||
//globale Objekte anlegen
|
|||
volatile PCD8544_SPI lcd; |
|||
volatile myInterrupts Timer2; |
|||
volatile myInterrupts pwmBL; |
|||
volatile shiftRegButton tasten; |
|||
|
|||
//Kommandos
|
|||
#define nothing 9 //reset/nichts tun
|
|||
#define speedA 1 // set speed A + speed
|
|||
#define dirA 2 // set direction A + dir
|
|||
#define speedB 3 // set speed B + speed
|
|||
#define dirB 4 // set direction B + dir
|
|||
#define goDrive 5 //go + time to go
|
|||
#define stopDrive 6 //stop
|
|||
#define getTemp 7 //get temperature
|
|||
#define timeToDrive 8 //Zeitdauer des fahrens
|
|||
|
|||
int pwmA = 0; |
|||
int pwmB = 0; |
|||
bool forwardA = true; |
|||
bool forwardB = true; |
|||
bool driveOn = false; |
|||
uint16_t driveTimeout = 0; |
|||
//#define highByte(x) ( (x) >> (8) ) // keep upper 8 bits
|
|||
//#define lowByte(x) ( (x) & (0xff) ) // keep lower 8 bits
|
|||
|
|||
#include <SPI.h>
|
|||
#include <nRF24L01.h>
|
|||
#include <RF24.h>
|
|||
|
|||
RF24 radio(A2, A3); // CE, CSN
|
|||
|
|||
const byte address[6] = "00001"; |
|||
|
|||
uint8_t commands[32]; |
|||
|
|||
const String mainMenu[] = { |
|||
"fahren", //0
|
|||
"stoppen", //1
|
|||
"manuell fahren", //2
|
|||
"", //3
|
|||
"", //4
|
|||
"", //5
|
|||
"", //6
|
|||
"", //7
|
|||
"", //8
|
|||
"" //9
|
|||
}; |
|||
|
|||
const String subMenuEntry0[] = { |
|||
"Zeitdauer", |
|||
"Speed A", |
|||
"Speed B", |
|||
"Starten" |
|||
}; |
@ -0,0 +1,18 @@ |
|||
void remoteControlInit() { |
|||
//Timer2 fuer 1ms initialisieren
|
|||
Timer2.initTimer2(); |
|||
Timer2.enableTimer2Interrupt(); |
|||
//Hintergrundbeleuchtung pwm
|
|||
pwmBL.initOCR1B(); |
|||
//Pegelwandler ein
|
|||
pinMode(_OE_LEVEL, OUTPUT); |
|||
digitalWrite(_OE_LEVEL, HIGH); |
|||
//Hintergrundbeleuchtung an, halbe Helligkeit
|
|||
pinMode(BL, OUTPUT); |
|||
BRIGHTNESS = 30; |
|||
//LCD init, invert, vop, tempcoef, bias
|
|||
lcd.begin(false, 0xB1, 0x04, 0x12); |
|||
lcd.clear(); |
|||
//erster Taster check
|
|||
tasten.checkButtons(); |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue