Интернет-лаборатория роботов ZiZiBOT.RU

Проектирование и разработки в области робототехники и автоматизации технологических процессов. Производство готовых роботов и конструкторов для творчества. Консультации и обучение по электронике и программированию.

г. Юрга,
ул.Ленинградская 38/83

+7 923-503-6074

Делаем инфракрасный датчик расстояния с двойным опросом

Две версии на основе tcrt5000l и сборной пары.

Делаем два опроса фототранзистора: при зажженном и отключенном светодиоде, получаем два значения, разница между ними величина потока света, отраженного от объекта, который перед датчиком.

Программа реализована с использованием возможностей встраиваемой операционной системы FreeRTOS для опроса датчиков в фоне.

scheme



#define GPUO_IRDIODE 16//4
#define GPIO_IRTRANSISTOR 34//35
 
#define GPUO_IRDIODE2 4
#define GPIO_IRTRANSISTOR2 35
 
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
double sensorvolume=0;
double sensorvolume2=0;
void TaskIrSensor (void);
void TaskSerialPrint (void);
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
void setup()
{
  Serial.begin(115200);
  pinMode(GPUO_IRDIODE, OUTPUT);
  pinMode(GPIO_IRTRANSISTOR, INPUT);
  pinMode(GPUO_IRDIODE2, OUTPUT);
  pinMode(GPIO_IRTRANSISTOR2, INPUT);
  xTaskCreatePinnedToCore(TaskIrSensor, "irsensors", 4096, NULL, 10, NULL, 0);
  xTaskCreatePinnedToCore(TaskSerialPrint, "printInfo", 4096, NULL, 1, NULL, 0);
}
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
void loop()
{
}
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
void TaskIrSensor (void *pvParameters)
{
//   TickType_t xLastWakeTime;
//  xLastWakeTime = xTaskGetTickCount ();
int ligh_s;
int ligh_s2;
  while (true)
  {
    digitalWrite(GPUO_IRDIODE, HIGH);
    digitalWrite(GPUO_IRDIODE2, HIGH);
    vTaskDelay(5); //Отдаем управление на 5мСек  
 
    ligh_s=0; ligh_s2=0;
    for(int i=0;i<5;i++) { ligh_s-=analogRead(GPIO_IRTRANSISTOR); ligh_s2-=analogRead(GPIO_IRTRANSISTOR2);}
 
    digitalWrite(GPUO_IRDIODE, LOW);
    digitalWrite(GPUO_IRDIODE2, LOW);
    vTaskDelay(5); //Отдаем управление на 5мСек  
 
    for(int i=0;i<5;i++){ ligh_s+=analogRead(GPIO_IRTRANSISTOR);  ligh_s2+=analogRead(GPIO_IRTRANSISTOR2);}
    ligh_s = constrain(ligh_s,0,16000);
    ligh_s2 = constrain(ligh_s2,0,16000);
 
    sensorvolume = double(ligh_s);
    sensorvolume2 = double(ligh_s2);
  }
}
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
void TaskSerialPrint (void *pvParameters)
{
   TickType_t xLastWakeTime;
   xLastWakeTime = xTaskGetTickCount ();
  while (true)
  {
  Serial.print(sensorvolume); Serial.print(" == "); Serial.println(sensorvolume2);
  vTaskDelayUntil( &xLastWakeTime, 300 ); //Отдаем управление на 5мСек
  }
}
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
ОСТАВИТЬ КОММЕНТАРИЙ

Форма авторизации

ВОЙТИ С ПОМОЩЬЮ:
ИЛИ Авторизация на сайте:

или


X

Написать сообщение:

Укажите свой номер телефона И e-mail для обратной связи
- e-mail
И
- номер телефона

Текст сообщения: