Помогите разобраться
- Войдите на сайт для отправки комментариев
Сб, 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 местах в сети, но ... Вы где-нибудь видели, чтобы кроме неё в программе было ещё что-то, да ещё и с такими ахрененными (почти по полсекунды) делэями? Люди, наоборот, её в прерывание вставляют, чтобы она немедленно обработку начинала! Чего Вы от неё, бедной, ждёте?
честно говоря мне лень разбирать скетч) но у меня была проблема с тем что пульт дешевый и сигнал надо направлять с точностью до милиметра,поэтому я отказался от ик!