Помогите разобраться
- Войдите на сайт для отправки комментариев
Сб, 20/07/2019 - 13:01
Добрый день, помогите разобраться со скетчем. Attiny85 с подключенными две servo, HC-SR04, ик приемник. Не реагирует на пульт.
#include "Servo8bit.h" #define trigPin 0 #define echoPin 3 int ir_pin = 4; int motorPinL = 1; int motorPinR = 2; int key; int start_bit = 2000; int bin_1 = 1000; int bin_0 = 400; unsigned long stoptimer; boolean autoMode; Servo8Bit motorL, motorR; void setup() { pinMode(ir_pin, INPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); motorL.attach(motorPinL); motorR.attach(motorPinR); //Serial.begin(9600); digitalWrite(0, HIGH); } void loop() { key = getIRKey(); if (key != -1) { //Serial.println(key); if (key = 0xFF18E7){moveMotors(160, 160);} //up 2 if (key = 0xFF4AB5){moveMotors(10, 10);} //down 8 if (key = 0xFF10EF){moveMotors(10, 160);} //left 4 if (key = 0xFF5AA5){moveMotors(160, 10);} //right 6 if (key = 0xFF30CF){ autoMode = !autoMode; moveMotors(94, 85); delay(400); } if (key = 0xFF7A85){ motorL.detach(); motorR.detach(); } } stoptimer = millis(); } void moveMotors(int speedL, int speedR){ motorL.write(speedL); motorR.write(180-speedR); } int getIRKey() { int data[12]; while(pulseIn(ir_pin, LOW, 20000) < 2200) { if(stoptimer+20 < millis() && !autoMode) moveMotors(94, 85); if(autoMode){ if(getDistance() < 10){ moveMotors(94, 20); delay(400); } else{ moveMotors(120, 120); } } key = 0; } stoptimer = millis()+1000; data[0] = pulseIn(ir_pin, LOW); data[1] = pulseIn(ir_pin, LOW); data[2] = pulseIn(ir_pin, LOW); data[3] = pulseIn(ir_pin, LOW); data[4] = pulseIn(ir_pin, LOW); data[5] = pulseIn(ir_pin, LOW); data[6] = pulseIn(ir_pin, LOW); data[7] = pulseIn(ir_pin, LOW); data[8] = pulseIn(ir_pin, LOW); data[9] = pulseIn(ir_pin, LOW); data[10] = pulseIn(ir_pin, LOW); data[11] = pulseIn(ir_pin, LOW); for(int i=0;i<=11;i++) { if(data[i] > bin_1) { data[i] = 1; } else { if(data[i] > bin_0) { data[i] = 0; } else { data[i] = 2; } } } for(int i=0;i<=11;i++) { if(data[i] > 1) { return -1; } } int result = 0; int seed = 1; for(int i=11;i>=0;i--) { if(data[i] == 1) { result += seed; } seed = seed * 2; } return result; } int getDistance(){ long duration; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); return (duration/2) / 29.1; }
Скетч сами писали? Судя по функции getIRKey() - нет. Она встречается в 100500 местах в сети, но ... Вы где-нибудь видели, чтобы кроме неё в программе было ещё что-то, да ещё и с такими ахрененными (почти по полсекунды) делэями? Люди, наоборот, её в прерывание вставляют, чтобы она немедленно обработку начинала! Чего Вы от неё, бедной, ждёте?
честно говоря мне лень разбирать скетч) но у меня была проблема с тем что пульт дешевый и сигнал надо направлять с точностью до милиметра,поэтому я отказался от ик!