Ein Roboter mit bürstenlosem Antrieb, differenzial und NRF24L01 Funk. Großflächig gebaut um ein großes Solarpanel aufzunehmen. https://gitlab.informatik.hs-fulda.de/fdai5253/roboter
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
4.6 KiB

/*
* 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";
const byte address2[6] = "00002";
//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
#define getDistance 10 //Abstand zu Objekten
//Motortreiber
#include <L298N.h>
#define BEEP 14 //Motoren drehen bei diesem PWM Wert nicht, aber fiepen
L298N drive;
volatile int pwmA = 0;
volatile int pwmB = 0;
bool forwardA = true;
bool forwardB = true;
volatile bool driveOn = false;
volatile uint32_t driveTimeout = 0;
volatile uint32_t driveTimeDiff = 0;
volatile bool startNewMeasurement = true;
volatile uint32_t pulseStart = 0;
volatile uint32_t pulseLength = 1;
volatile bool newResult = false;
uint32_t timer = 0;
int16_t temperature = 0;
uint16_t distance = 50;
void setup() {
Serial.begin(115200);
// motorA.setPWM16(2,RESOLUTION);
// motorB.setPWM16(2,RESOLUTION);
radio.begin();
radio.openWritingPipe(address2);
radio.openReadingPipe(1, address);
radio.setPALevel(RF24_PA_MAX);
radio.startListening();
clearCommands();
//Temperatur- und Abstandsmessung
setEchoPins(A2, 6); //16: A2, 6: D6
tempDistSetup();
timer = millis();
}
void loop() {
//Temperatur- und Abstandsmessung
if((millis() - timer) >= 100){
temperature = dallas(4, 0);
if(startNewMeasurement) {
measureDistance();
}
timer = millis();
}
if(newResult) {
// Serial.println("berechnen");
distance = calculateDistance();
}
//wurden Kommandos empfangen?
if (radio.available()) {
radio.read(&commands, sizeof(commands));
commandInterpretation();
}
//Antrieb abschalten wenn kein neuer Fahrbefehl kommt
if(((millis() - driveTimeDiff) > driveTimeout)) {
pwmA = 0;
pwmB = 0;
}
//Wenn Mindestdistanz unterschritten, stopp
if(distance < 20){
if(pwmA < 0 && pwmB < 0){
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 : {
//Serial.println("Senden!");
radio.stopListening();
int16_t sendData = temperature;
radio.write(&sendData, sizeof(int16_t));
radio.startListening();
break;
}
case timeToDrive : {
uint16_t driveTime = 0;
driveTime = (0xFF00 & (commands[i+1] << 8));
driveTime |= (0x00FF & commands[i+2]);
driveTimeout = (uint32_t)driveTime;
driveTimeDiff = millis();
//Serial.println(driveTimeout);
break;
}
default : {
break;
}
}
}
clearCommands();
}