Помогите разобраться

Elektro
Offline
Зарегистрирован: 10.02.2012

 Всем доброго времени!

вообщем мне нужно сделать ик бмпер на двух тсопах. со схемой все понятно, не мого ну икак разобраться со скетчем, нужно принять сигнал с 2х TSOPов.

прочтитал про прерывания понял как они работаю. но овт на практике не получается.

начал с простого (для индикации светодиоды, для подачи сигнала кнопка).

volatile int state = LOW;

 void setup ()
 {
 pinMode(12,OUTPUT);//сигнальный светодиод
 pinMode(2,INPUT);//вход 
 pinMode(11, OUTPUT);//сигнальный светодиод
 attachInterrupt(0, blink, CHANGE);

 }

void loop ()
 {
 digitalWrite(12, LOW);
 digitalWrite(11, HIGH);
 if(state==HIGH){ 
 digitalWrite(12,HIGH);
 digitalWrite(11, LOW);
 delay(2000);
 }
 

 }
 void blink() {
 state = !state;
 }

вот это работает =/ но не могу сделать что бы было с двумя входами тоесть левый датчик и правый.

помогите пожалуйста.

Elektro
Offline
Зарегистрирован: 10.02.2012

 Не ужели никто не поможет?(

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Есле не ошибаюсь должно помочь вот ссылка http://letsmakerobots.com/node/10822 

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012
Elektro
Offline
Зарегистрирован: 10.02.2012

Спасибо, хорошие стаьи, только я там кода для ардуины ни какого не нашел( 

maksim
Offline
Зарегистрирован: 12.02.2012

 Попробуй вот так:

 
volatile int state = LOW;
volatile int state1 = LOW;
	 
void setup ()
{
pinMode(2,INPUT);//вход 1
pinMode(3,INPUT);//вход 2

pinMode(12,OUTPUT);//сигнальный светодиод 1
pinMode(11, OUTPUT);//сигнальный светодиод 2

pinMode(10,OUTPUT);//сигнальный светодиод 3
pinMode(9, OUTPUT);//сигнальный светодиод 4

attachInterrupt(0, blink, CHANGE);
attachInterrupt(1, blink1, CHANGE);	 
}
void loop ()
{
digitalWrite(12, LOW);
digitalWrite(11, HIGH);

digitalWrite(10, LOW);
digitalWrite(9, HIGH);

if(state==HIGH){ 
digitalWrite(12,HIGH);
digitalWrite(11, LOW);
delay(2000);
}

if(state1==HIGH){ 
digitalWrite(10,HIGH);
digitalWrite(9, LOW);
delay(2000);
}	  	 
}

void blink() {
state = !state;
}

void blink1() {
state1 = !state1;
}

 

 

Elektro
Offline
Зарегистрирован: 10.02.2012

 maksim

спасибо! моя ошибка была в том что я обе переменные запихивал в void blink() а не в разные, работает теперь, вот только при подачи сигнала на 2 порт, сигнальные сведодиоды срабатывают как нужно но вот в изначально иногда не хотят возвращаться =/? в чем может быть проблема? 

 

сегодня решил проблему немного по другому реализовав на одном тсопе. если кому интересно то вот:

int LedRightPin = 10; //Левый светодиод
int LedLeftPin = 9; //Правый светодиод
int TsopPin = 2; // тсоп вход

unsigned char PIN_HBRIDGE_1A = 11; //выходы на ДД
unsigned char PIN_HBRIDGE_2A = 12;
unsigned char PIN_HBRIDGE_3A = 6;
unsigned char PIN_HBRIDGE_4A = 5;

void MotorLeftStop()
{
  digitalWrite(PIN_HBRIDGE_1A, LOW);
  digitalWrite(PIN_HBRIDGE_2A, LOW);
}

void MotorLeftForward()
{
  digitalWrite(PIN_HBRIDGE_1A, HIGH);
  digitalWrite(PIN_HBRIDGE_2A, LOW);
}

void MotorLeftReverse()
{
  digitalWrite(PIN_HBRIDGE_1A, LOW);
  digitalWrite(PIN_HBRIDGE_2A, HIGH);
}

void MotorRightStop()
{
  digitalWrite(PIN_HBRIDGE_3A, LOW);
  digitalWrite(PIN_HBRIDGE_4A, LOW);
}

void MotorRightForward()
{
  digitalWrite(PIN_HBRIDGE_3A, LOW);
  digitalWrite(PIN_HBRIDGE_4A, HIGH);
}

void MotorRightReverse()
{
  digitalWrite(PIN_HBRIDGE_3A, HIGH);
  digitalWrite(PIN_HBRIDGE_4A, LOW);
}

void GoForward()
{
  MotorLeftForward();
  MotorRightForward();
}

void GoReverse()
{
  MotorLeftReverse();
  MotorRightReverse();
}

void setup()
{
  pinMode(LedRightPin, OUTPUT);
  pinMode(LedLeftPin, OUTPUT);
  pinMode(TsopPin, INPUT);
  pinMode(PIN_HBRIDGE_1A, OUTPUT);
  pinMode(PIN_HBRIDGE_2A, OUTPUT);
  pinMode(PIN_HBRIDGE_3A, OUTPUT);
  pinMode(PIN_HBRIDGE_4A, OUTPUT);
}

void loop()
{
  GoForward(); //движемся вперед
  
tone(LedLeftPin, 38000); // генерируем сигнал.на левый светодиод
  delay(50);
  if(digitalRead(TsopPin)==LOW)// если сигнал есть то..
  {
    MotorRightReverse(); //поварачиваем на право
    MotorLeftForward();
    delay(2000);
  }
  noTone(LedLeftPin); // тушим СД

  tone(LedRightPin, 38000); //генерируем сигнал на правый СД
  delay(50);  
  if(digitalRead(TsopPin)==LOW) //если сигнал есть то ...
  {
    MotorLeftReverse(); //поварачиваем на лево
    MotorRightForward();
    delay(2000);
  }
  noTone(LedRightPin);  //тушим СД
}