С чего начинаются роботы?

January 27, 2012 by admin Комментировать »

Пришло  время  написать  программу  для  семафора,  который  будет  работать  под  управлением модуля Arduino.

Как должна работать программа? В самом общем виде: если семафор «видит» ИК-код, он включает зелёный свет, который выключает через несколько секунд, включая красный.

Видеть ИК-код семафор будет с помощью фотоприёмника TSOP. Но не просто видеть какой- либо инфракрасный сигнал, а «прочитывать» придуманный нами код. Если код совпадает, то семафор переключается.

У осциллографа мы подключали фотоприёмник к аналоговому входу. Но на выходе фотоприёмника сигнал, который удобно читать цифровым входом. Как вы помните, а если забыли, то посмотрите программу ещё раз, похожую работу выполняет программа для модуля Arduino, которая называется «Button, кнопка». Мы вполне можем себе представить работу фотоприёмника, как работу кнопки, которую нажимают на определённые промежутки времени. Поэтому, взяв программу за основу, мы модифицируем её. Вот эта программа на языке Arduino.

// set pin numbers:

const int buttonPin = 2;         // номер вывода подключѐнной кнопки

const int ledPin =      13;      // номер вывода светодиода

// variables will change:

int buttonState = 0;             // переменная для чтения состояния кнопки

void setup() {

// инициализация вывода светодиода, как выхода

pinMode(ledPin, OUTPUT);

// инициализация вывода кнопки, как входа

pinMode(buttonPin, INPUT);

}

void loop(){

// читаем состояние кнопки, как значение

buttonState = digitalRead(buttonPin);

// проверяем, нажата ли кнопка

// если да, то buttonState имеет значение HIGH:

if (buttonState == HIGH) {

// включаем LED

digitalWrite(ledPin, HIGH);

}

else {

// выключаем LED

digitalWrite(ledPin, LOW);

}

}

В первую очередь изменим задание выводов.

// установка выводов

const int photoPin = 2;      // номер вывода, к которому подключѐн фотоприѐмник const int ledPinGreen =                13;      // номер вывода зелѐного светодиода

const int ledPinRed =      12;       // номер вывода красного светодиода

Зададим переменную для приёма состояния цифрового входа D2.

//  переменная для хранения состояния входа

int   photoState  =  HIGH;            //  переменная  для  чтения  состояния фотоприѐмника

В разделе инициализации запишем:

void setup() {

// инициализируем выходы для светодиодов

pinMode(ledPinGreen, OUTPUT);

pinMode(ledPinRed, OUTPUT);

// инициализируем вход для фотоприѐмника

pinMode(photoPin, INPUT);

}

Основная  программа  будет  похожа  на  оригинал  —  мы  постоянно  читаем  вход,  когда  он переходит в состояние с низким логическим уровнем, мы будем читать код.

void loop(){

// включаем красный свет

digitalWrite(ledPinRed, HIGH);

// читаем состояние входа

photoState = digitalRead(photoPin);

// проверяем есть ли пачка импульсов

// если есть, то photoState становится LOW

if (photoState == LOW) {

// начинаем читать код и переключать светодиоды, если код «свой»

}

Теперь,  как  мы  будем  читать  код?  Мы  получили  переход  на  цифровом  входе  в  низкое состояние, а с правильным кодом это состояние продлится 4 мС. Затем последует пауза (нет несущей частоты), когда вход перейдёт в высокое состояние. Пауза длится 1 мС. Для проверки нашего  кода  достаточно  сделать  паузу  в  4.5  мС  и  проверить,  перешёл  ли  вход  в  высокое состояние?

Затем будем проверять состояние, стараясь попадать в «середину» состояний после переходов

(нашего кода), если это не так, то возвращаемся в начало программы.

if (photoState == LOW) {

// начинаем читать код и переключать светодиоды, если код «свой»

delayMicroseconds(4500);           // ждѐм 4.5 мС

photoState = digitalRead(photoPin);

if (photoState == HIGH){

delay(1);                   // ждѐм 1 мС

photoState = digitalRead(photoPin);

if (photoState == LOW){

delay(1);                          // ждѐм 1 мС photoState = digitalRead(photoPin); if (photoState == HIGH){

delay(1);                                 // ждѐм 1 мС

photoState = digitalRead(photoPin);

if (photoState == LOW){

delayMicroseconds(3500);                                      // ждѐм 3.5 мС

if (photoState == HIGH){

digitalWrite(ledPinRed, LOW); // выключаем красный digitalWrite(ledPinGreen, HIGH);//включаем зелѐный delay(2000); // зелѐный 2 секунды digitalWrite(ledPinGreen, LOW);//выключаем зелѐный

}

}

}

}

}

}// иначе ничего не делаем

И теперь соберём всю программу вместе (в тексте программы есть ошибка, о которой мы поговорим позже!).

// установка выводов

const int photoPin = 2;         // номер вывода, к которому подключѐн фотоприѐмник

const int ledPinGreen =       13;      // номер вывода зелѐного светодиода

const int ledPinRed =       12;           // номер вывода красного светодиода

int photoState = HIGH;          // переменная для чтения состояния фотоприѐмника

void setup() {

// инициализируем выходы для светодиодов pinMode(ledPinGreen, OUTPUT); pinMode(ledPinRed, OUTPUT);

// инициализируем вход для фотоприѐмника

pinMode(photoPin, INPUT);

}

void loop(){

// включаем красный свет

digitalWrite(ledPinRed, HIGH);

// читаем состояние входа

photoState = digitalRead(photoPin);

// проверяем есть ли пачка импульсов

// если есть, то photoState становится LOW

if (photoState == LOW) {

// начинаем читать код и переключать светодиоды, если код «свой»

delayMicroseconds(4500);           // ждѐм 4.5 мС

photoState = digitalRead(photoPin);

if (photoState == HIGH){

delay(1);                   // ждѐм 1 мС

photoState = digitalRead(photoPin);

if (photoState == LOW){

delay(1);                          // ждѐм 1 мС

photoState = digitalRead(photoPin);

if (photoState == HIGH){

delay(1);                                 // ждѐм 1 мС

photoState = digitalRead(photoPin);

if (photoState == LOW){

delayMicroseconds(3500);                                      // ждѐм 3.5 мС

if (photoState == HIGH){

digitalWrite(ledPinRed, LOW); // выключаем красный digitalWrite(ledPinGreen, HIGH);//включаем зелѐный delay(2000); // зелѐный 2 секунды digitalWrite(ledPinGreen, LOW);//выключаем зелѐный

}

}

}

}

}

}// иначе ничего не делаем

}

Думаю, проверить её на макетной плате будет сложнее, чем за компьютером. Поэтому до загрузки программы в модуль Arduino попробуем проверить всё в программе VirtualBreadboard.

Генератора, способного формировать нужный сигнал, который имитировал бы работу фотоприёмника, я не надеюсь найти, но хочу использовать в качестве такого генератора обычную кнопку. А для отладочных операций, кроме светодиодов семафора, я добавлю (и в программу, и на макетную плату) ещё один светодиод. В результате макет выглядит следующим образом.

Рис. 10.1. Подготовка к проверке программы в VBB

В программу добавлена строка в определение переменных и констант:

const int ledPinDebug = 11; // отладочный LED

И в начале основного цикла:

digitalWrite(ledPinDebug, LOW);

Для кнопки (в её свойствах после выделения на макете), щёлкнув по клавише рядом «Contact

Type», я выбираю режим, при котором нажатая кнопка даёт низкий логический уровень.

Рис. 10.8. Готовые модули и блоки в радиомагазине

Но самое главное, чем вам следует обзавестись, это желанием научиться всему, терпением и умением придумывать что-то своё и реализовывать эти задумки. Возможно, обретя эти навыки, вы выберете себе профессию, увлекательную и современную, создателя роботов. Успехов вам!

Источник: Гололобов В. – С чего начинаются роботы. О проекте Arduino для школьников (и не только) – 2011

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты