14-07-2017, 22:04
(Ten post był ostatnio modyfikowany: 02-08-2017, 10:10 przez CEO.
Powód edycji: Nie rozdzielamy postów
)
Witajcie! Jako że ten dział jest jeszcze pusty postanowiłem wstawić tu swojego prostego robota. Robot powstał z przede wszystkim z nudów.. I kilku dość tanich części. Sterownik robota polutowałem sobie sam, z atmegą328 bo szkoda mi było arduina do tej zabawki. Tym niemniej jesli ktoś chce to wystarczy arduino nano, mostek h, odbiornik podczerwieni, najtańsze napędy (kosztowały po kilkanaście zł za sztukę). Uwaga jeśli ktoś zechce zrobić takiego samego robota potrzeba trochę wiedzy z elektroniki i troszkę z programowania w Arduino bo schemat niestety gdzieś mi się zgubił a i z pilotem będzie troszkę zabawy bo można zastosować dowolny. Napiszę więcej jeśli będzie zainteresowanie moim robotem.
Kod:
#include <IRLib.h>
#include <avr/wdt.h>
int RECV_PIN = 10;
IRrecv My_Receiver(RECV_PIN);
IRdecode My_Decoder;
IRdecodeHash My_Hash_Decoder;
#define L_PWM 6
#define R_PWM 5
#define L_MOTOR1 7
#define L_MOTOR2 8
#define R_MOTOR1 3
#define R_MOTOR2 2
#define stdby 4
uint8_t PWM_MAX =100;
int a=0;
long unsigned asygnal=0;
long unsigned stary_asygnal=0;
boolean jadzie = false;
long timer;
const long timeout = 8000;
uint8_t korekcja_w_prawo=12;
uint8_t korekcja_w_lewo=0;
volatile uint8_t speeed=5;
/*uwaga!!! sprawdĹĽ czy korekcja + PWM_MAX nie przekroczy
* wartosci 255
* bo licznik siÄ przekrÄci i bÄdzie dziwnie jechać!!!
*/
void setup() {
TCCR0B = TCCR0B & 0b11111000 | 0x01; // to zwiÄksza czÄstotliwość pwm
//zeby nie piszczał
// Serial.begin(9600);
//Konfiguracja pinow od mostka H
pinMode(L_PWM, OUTPUT);
pinMode(R_PWM, OUTPUT);
pinMode(R_MOTOR1, OUTPUT);
pinMode(R_MOTOR2, OUTPUT);
pinMode(L_MOTOR1, OUTPUT);
pinMode(L_MOTOR2, OUTPUT);
// pinMode(stdby, OUTPUT);
digitalWrite(stdby, HIGH);
// pinMode(ledPin, OUTPUT);
My_Receiver.enableIRIn(); // Start the receiver
wdt_enable(WDTO_250MS);
}
//MOJE FUNKCJE DO KIERUNKU BO NIE PWM-DIR
void prawyPrzod(){
digitalWrite(R_MOTOR1, LOW);
digitalWrite(R_MOTOR2, HIGH);
}
void prawyTyl(){
digitalWrite(R_MOTOR1, HIGH);
digitalWrite(R_MOTOR2, LOW);
}
void prawyStop(){
digitalWrite(R_MOTOR1, LOW);
digitalWrite(R_MOTOR2, LOW);
}
void lewyPrzod(){
digitalWrite(L_MOTOR1, LOW);
digitalWrite(L_MOTOR2, HIGH);
}
void lewyTyl(){
digitalWrite(L_MOTOR1, HIGH);
digitalWrite(L_MOTOR2, LOW);
}
void lewyStop(){
digitalWrite(L_MOTOR1, LOW);
digitalWrite(L_MOTOR2, LOW);
}
void loop() {
wdt_reset();
if(jadzie &&(millis() - timer>=timeout))
{
prawyStop();
lewyStop();
analogWrite(L_PWM,0);
analogWrite(R_PWM,0);
if(PWM_MAX>90)
{
speeed=160;
}
else speeed=50;
jadzie=false;
}
if (My_Receiver.GetResults(&My_Decoder)) {//Puts results in My_Decoder
My_Hash_Decoder.copyBuf(&My_Decoder);//copy the results to the hash decoder
My_Hash_Decoder.decode();
asygnal=(My_Hash_Decoder.hash); // Do something interesting with this value
//delay(1000);
switch( asygnal )
{
case 3303967769:
prawyPrzod();
lewyPrzod();
analogWrite(R_PWM,speeed+korekcja_w_lewo);
analogWrite(L_PWM,speeed+korekcja_w_prawo);
if(speeed>=(PWM_MAX-20))
{
speeed=PWM_MAX;
}
else speeed+=20;
// delay(3);
timer=millis();
jadzie=true;
break;
case 1382971643:
prawyTyl();
lewyTyl();
analogWrite(R_PWM,speeed+korekcja_w_lewo);
analogWrite(L_PWM,speeed+korekcja_w_prawo);
timer=millis();
if(speeed>=(PWM_MAX-20))
{
speeed=PWM_MAX;
}
else speeed+=20;
// delay(3);
jadzie=true;
break;
//...
case 3124476853: //zakrÄt w lewo
prawyPrzod();
lewyTyl();
analogWrite(R_PWM,60+korekcja_w_lewo);
analogWrite(L_PWM,60+korekcja_w_prawo);
timer=millis();
jadzie=true;
break;
case 2024647355: //zakrÄt w prawo
prawyTyl();
lewyPrzod();
analogWrite(R_PWM,60+korekcja_w_lewo);
analogWrite(L_PWM,60+korekcja_w_prawo);
timer=millis();
jadzie=true;
break;
case 1147213747:
prawyStop();
lewyStop();
analogWrite(R_PWM,0);
analogWrite(L_PWM,0);
timer=millis();
// jadzie=true;
case 1962229077: //wolny zakrÄt w lewo
prawyPrzod();
lewyTyl();
analogWrite(R_PWM,140+korekcja_w_lewo);
analogWrite(L_PWM,140+korekcja_w_prawo);
timer=millis();
jadzie=true;
break;
case 634478837: //wolny zakrÄt w prawo
prawyTyl();
lewyPrzod();
analogWrite(R_PWM,140+korekcja_w_lewo);
analogWrite(L_PWM,140+korekcja_w_prawo);
timer=millis();
jadzie=true;
break;
case 3932544983: //wolny zakrÄt w prawo dwoma koĹ‚ami
// prawyTyl();
lewyPrzod();
// analogWrite(R_PWM,160+korekcja_w_lewo);
analogWrite(R_PWM,PWM_MAX);
timer=millis();
jadzie=true;
break;
case 4013764499: //wolny zakrÄt w lewo dwoma koĹ‚ami
prawyPrzod();
// lewyPrzod();
analogWrite(L_PWM,PWM_MAX);
// analogWrite(L_PWM,160+korekcja_w_prawo);
timer=millis();
jadzie=true;
break;
case 1214490363: // pilot 1
PWM_MAX=30;
break;
case 3156748341: //pilot 2
PWM_MAX=35;
break;
case 1615146455: //pilot3
PWM_MAX=45;
break;
case 2878395089: //pilot 4
PWM_MAX=70;
break;
case 2684931703: //pilot 5
PWM_MAX=90;
break;
case 1447363761: //pilot 6
PWM_MAX=120;
break;
case 1303779347: //pilot 7
PWM_MAX=150;
break;
case 2031809173: //pilot 8
PWM_MAX=200;
break;
case 3662083799: //pilot 9
PWM_MAX=200;
break;
}
My_Receiver.resume();
}
}