Проблема подключения датчика Холла к ардуино нано
- Войдите на сайт для отправки комментариев
Вс, 21/09/2014 - 09:31
Здравствуйте.
Помогите мне, пожалуйста, решить мою проблему с работой датчика Холла. Я использую ардуино нано и датчик холла с LM393. Вообще-то у меня имеется два датчика, один из них подключен к выходу RX0, другой к D10. Тот, который подключен к RX0 работает замечательно, видит магнит, а который к 10 выходу при подключении к ардуино перестает реагировать на магнит. Если я его отключаю от ардуино то все работает. Код вы можете посмотреть ниже, я использую еще NRF24l01 и Adafruit Motor Shield. Сам не очень разбираюсь в этих вещах, код писал знакомый перуанец и до него я достучаться не могу, он уже гдке-то в Южной Америке.
/**
* Prog for Remote Control
*
* Pins:
* Hardware SPI:
* MISO -> 12
* MOSI -> 11
* SCK -> 13
*
* Configurable:
* CE -> 8
* CSN -> 7
*
*/
#include <AFMotor.h>
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
AF_DCMotor motor(3,MOTOR12_64KHZ);
//AF_DCMotor Selenoide(3);
int S0 = 10; // Sensor 0
int S1 = 0; // Sensor 1
int pre_state =1; // 1:
int In_S0 = 0; // Input Sensor 0
int In_S1 = 0; // Input Sensor 1
int ChangeState;
// Pin 4,5,7,8,10,12 are used for DC Motor
int Selenoid = 5; // selenoid 1
int State = 0; //Idle
int NxtState = 0;
byte Data_send=0;
unsigned long Command;
void setup(){
// Configure pin mode for inputs
//Selenoide.setSpeed(0);
//Selenoide.run(RELEASE);
motor.run(FORWARD);
motor.setSpeed(255);
motor.run(RELEASE);
delay(4000);
pinMode(Selenoid, OUTPUT);
pinMode(S0, INPUT_PULLUP);
pinMode(S1, INPUT_PULLUP);
Serial.begin(9600);//Set the SPI Driver.
Mirf.spi = &MirfHardwareSpi;//Setup pins / SPI.
Mirf.init();
Mirf.setRADDR((byte *)"Actuator");//Configure reciving address.
//Set the payload length to sizeof(unsigned long) the
//return type of millis().
//NB: payload on client and server must be the same.
Mirf.payload = sizeof(unsigned long);
/*
* Write channel and payload config then power up reciver.
*/
Mirf.config();
Serial.println("Actuator Ready");
byte data[Mirf.payload]; //A buffer to store the data.
}
void loop(){
State=NxtState;
if(Mirf.dataReady()){
//ChangeState=1;
Serial.println("DATA...");
Mirf.getData((byte *) &Command);
}else{
//ChangeState=1;
Command=-1;
}
In_S0=digitalRead(S0);
In_S1=digitalRead(S1);
ChangeState=1;
if(ChangeState){
switch ( State ) {
case 0: // IDLE
if((Command==1) && (pre_state==2)){ pre_state=State;
NxtState=1;} // NxtState=UP
else if((Command==2)&& (pre_state==1)){ pre_state=State;
NxtState=2;} //NxtState=DOWN
else{NxtState=0;}
break;
case 1: // UP
if(Command==2){ pre_state=State;
NxtState=2;} // NxtState=DOWN
else if(Command==3){pre_state=State;
NxtState=3;} //NxtState=STOP
else if(In_S0==0){pre_state=State;
NxtState=0;} //NxtState=IDLE
else{NxtState=1;}
break;
case 2: // DOWN
if(Command==1){pre_state=State;
NxtState=1;} // NxtState=UP
else if(Command==3){pre_state=State;
NxtState=3;} //NxtState=STOP
else if(In_S1==0){pre_state=State;
NxtState=0;} //NxtState=DOWN
else{NxtState=2;}
break;
case 3: // STOP
if(Command==1){ pre_state=State;
NxtState=1;} // NxtState=UP
else if(Command==2){pre_state=State;
NxtState=2;} //NxtState=DOWN
else{NxtState=3;}
break;
default: // Note the colon, not a semicolon
Serial.println("Error in State machine...");
break;
}
}
switch ( State ) {
case 0: // IDLE
// Selenoide
digitalWrite(Selenoid, LOW);
delay(1500);
//UP
motor.run(RELEASE);
delay(1000);
Serial.println("State: IDLE");
break;
case 1: // UP
// Selenoide
digitalWrite(Selenoid, HIGH);
delay(1500);
//UP
//Serial.print("FORWARD");
motor.run(FORWARD);
motor.setSpeed(255);
Serial.println("State: UP Motor");
break;
case 2: // DOWN
// Selenoide
digitalWrite(Selenoid, HIGH);
delay(500);
//
//Serial.print("BACKWARD");
motor.run(BACKWARD);
motor.setSpeed(255);
Serial.println("State: DOWN Motor");
break;
case 3: // STOP
// Selenoide
digitalWrite(Selenoid, HIGH);
delay(500);
//STOPPED
motor.run(RELEASE);
delay(1000);
Serial.println("State: STOPPED Motor");
break;
default: // Note the colon, not a semicolon
Serial.println("Error in State machine...");
break;
}
}
NRF24l01 сидит и на 10 пине, а вы туда и датчик холла подключаете.
И код вставляйте правильно http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
и с RX-пина датчик нужно переместить на другой пин
круто
два провода воткнуть в одну дырку и не заметить
два провода ведь не лезут в одну дырку
круто
два провода воткнуть в одну дырку и не заметить
два провода ведь не лезут в одну дырку
У дырки 2 стороны. Он думает что если сверху то это верхняя 10 а если снизу то это нижняя 10. Вот.
NRF 24l01 сидит на 12,11,13,8 и 7. Нет, проблема не в том. Пока не решил в чем
Значится так, при подключение питания отдельно, от другого блока, все работает. Помогите разобраться, в чем проблема. Как сказал, NRF не подключено к 10 пину.
честно сказать не понял зачем компаратор. у холла выход открытый коллектор. делаете подтяжку и все
а просто датчики отдельно тестировали? без доп. шилдов и тп.
у меня датчик на одной плате с lm393. Сейчас попробую фотографию прикрепить. На самом датчике есть диод (если правильно называю) который указывает, работает он или нет. Если отключить его от ардуины- работает, если подключить питание с другого блока тоже работает. Ставлю другой датчик- таже ерунда, хотя при работе от RX0 тот датчик срабатывал. Т.е проблема либо в коде либо в подкючении, питании. Не знаю, пока могу только экспериментировать.
что за глупость цеплять на аналоговый пин? используй DO
много букв а все равно не понял. без ардуины датчики оба работают или нет? ну максимум питание с ардуины
К сожалению, я инженер-механие, потому не очень в этом всем разбираюсь. Если я подключаю к DO (так понял Digital Output) происходит обратное, те sensor просто гаснит и тоже не реагтрует на магнит (опять таки, на RX0 все стабильно)
хорошо, значит без ардуины датчики работают. Оба. С ардуиной один работает (который на RX0) один нет (который на pin10). Меняю их местами(физически). Происходит тоже самое, на RX0 работает, на pin 10 не работает. Питание у обоих от отдельного блока питания(не ардуино). Теперь подключаю неработающий датчик к другому блоку питания- работает. Надеюсь понятно. Если вруг не понятно, говорите еще раз все напишу и постараюсь объяснить
а земли объеденены? и зачем каждый датчик питать от отдельного блока питания?
Да, земли, фактически, объеденены. И питаются они от одного провода. Просто, в качестве эксперимента, запитал его от другого источника и все заработало. Но другой источник в конструкции не поместится, не могу использовать его.
ищи ошибку в схеме
если не затруднит, посмотрите программирование, может там какая ошибка забралась?
вот например)) поймешь о чем я
так вот еще прикол
короче если зря этот шилд использовал. вот из описалова данного шилда
на тех же пинах висит радиомодуль
лучше использовать внешний отдельный драйвер
вся проблема в безграмотности. не изучая что покупаешь, можно положить эту железку на полку до лучших времен ну или перепаивать
да, но это же вроде просто комментарии его к коду. В самом же коде вроде как не использован 10 пин. Или я ошибаюсь? Как можно посмотреть не использовал ли его где-нибудь дважды?
так изза этого я и привел кусок из описания данного шилда, так как комментарий не факт что правильный
коммент скорее всего не правильный. Перуанец писал, он как программист вроде ничего, но разговаривает, в основном, на испанском. Потому не все понимал, что он мне говорил. А сейчас он в Южной Америке, никак его поймать не могу
мда. забей уже на коммент
На это забил
описание посмотри. не получится нормально шилд и радиомодуль запустить на хардварном spi
А можно поподробней чуть, что сделать что-бы все заработало?
перепаивать или проводками подключать на другие пины. отказаться от либы для управления двигателем