Начал опять заниматься контроллером и конкретно этим шасси. Учусь программировать Ардуино, решив сделать WiFi-бота. Благо есть очень удачный мелкий роутер TP-LINK TL-MR3020 с ОпенРоботикс прошивкой, к которому еще нетрудно подключить внешнюю антенну и поднять дальность вайфая почти в два раза.
Пока же научился читать состояния датчиков и опять уперся в недостаточное количество ног Arduino Uno.
"На уровне шасси" ведь надо иметь:
2 датчика "пола" - 2 пина.
2 датчика "света" - 2 пина.
Ультразвуковой дальномер - 2 пина.
Драйвер L298N с ШИМ-регулировкой скорости и энкодерами - 4 х 2 = 8 пинов.
Итого уже 14 пинов. А ведь еще надо:
UART от роутера - 2 пина.
Серва на камеру - 1 пин.
Телеметрия напряжения батареи - 1 пин.
И даже если отказаться от датчиков освещенности - все равно "по хорошему" пинов не хватает на все хотелки.
Пока же скетч мой тестовый вот такой, части относящиеся к дальномеру закомментированы.
- Код: Выделить всё • Развернуть
/* Программа робота Tестовая версия 0.0.1 для Arduino Uno */
// Назначаем входы-выходы Arduino как переменные вида xxxPin
// int Trig_Pin = ; // Вход Trig ультразвукового дальномера, на который контроллер подает сигнал для посылки иипульса измерения
// int Echo_Pin = ; // Выход Echo ультразвукового дальномера, с которого контроллер получает сигнал импульса измерения
int Bamp1_Pin = 6 ; // Выход датчика "пола" номер 1, с которого контроллер получает сиогнал есть/нет пол
int Bamp2_Pin = 7 ; // Выход датчика "пола" номер 2, с которого контроллер получает сиогнал есть/нет пол
int Opt1_Pin = 8 ; // Выход датчика "света" номер 1, с которого контроллер получает сиогнал есть/нет свет на датчике
int Opt2_Pin = 9 ; // Выход датчика "света" номер 2, с которого контроллер получает сиогнал есть/нет свет на датчике
// int RxD_Pin = ; // Вход UART контроллера
// int TxD_Pin = ; // Выход UART контроллера
int Left1_Pin = 5 ; // Выход "Вперед" на драйвер двигателя левого борта
int Left2_Pin = 4 ; // Выход "Назад" на драйвер двигателя левого борта
int LeftPWR_Pin = 3 ; // Выход ШИМ "Скорость" на драйвер двигателя левого борта
int LeftSpeed_Pin = 2 ; // Вход "Скорость" энкодера двигателя левого борта
int Rignt1_Pin = 13 ; // Выход "Вперед" на драйвер двигателя правого борта
int Rignt2_Pin = 12 ; // Выход "Назад" на драйвер двигателя правого борта
int RigntPWR_Pin = 11 ; // Выход ШИМ "Скорость" на драйвер двигателя правого борта
int RigntSpeed_Pin = 10 ; // Вход "Скорость" энкодера двигателя правого борта
// Назначение переменных содержащих состояния датчиков
// unsigned int impulseTime=0; // Переменная содержащая значение времени импульса с дальномера
// unsigned int distance_sm=0; // Переменная содержащая значение дистанции с дальномера в сантиметрах
int valueBamp1 ; // Состояние датчика "пола" номер 1
int valueBamp2 ; // Состояние датчика "пола" номер 2
int valueOpt1 ; // Состояние датчика "света" номер 1
int valueOpt2 ; // Состояние датчика "света" номер 2
// Конфигурирование портов ввода-вывода Arduino и инициализация переменных, исполняется один раз при запуске
void setup()
{
Serial.begin(9600); // Конфигурирование последовательного порта на скорость 9600 бод
// pinMode(Trig_Pin, OUTPUT); // Конфигурирование порта как выход для посылки импульса дальномера
// pinMode(Echo_Pin, INPUT); // Конфмгурация порта как вход для приема импульса дальномера
pinMode(Bamp1_Pin, INPUT); // Конфигурация порта как вход для приема сигнала датчика "пола" номер 1
pinMode(Bamp2_Pin, INPUT); // Конфигурация порта как вход для приема сигнала датчика "пола" номер 2
pinMode(Opt1_Pin, INPUT); // Конфигурация порта как вход для приема сигнала датчика "света" номер 1
pinMode(Opt2_Pin, INPUT); // Конфигурация порта как вход для приема сигнала датчика "света" номер 2
pinMode(Left1_Pin, OUTPUT); // Конфигурация порта на выход "Вперед" на драйвер двигателя левого борта
pinMode(Left2_Pin, OUTPUT); // Конфигурация порта на выход "Назад" на драйвер двигателя левого борта
pinMode(LeftPWR_Pin, OUTPUT); // Конфигурация порта на выход ШИМ "Скорость" на драйвер двигателя левого борта
pinMode(LeftSpeed_Pin, INPUT); // Конфигурацмя порта на вход "Скорость" энкодера двигателя левого борта
pinMode(Rignt1_Pin, OUTPUT); // Конфигурация порта на выход "Вперед" на драйвер двигателя правого борта
pinMode(Rignt2_Pin, OUTPUT); // Конфигурация порта на выход "Назад" на драйвер двигателя правого борта
pinMode(RigntPWR_Pin, OUTPUT); // Конфигурация порта на выход ШИМ "Скорость" на драйвер двигателя правого борта
pinMode(RigntSpeed_Pin, INPUT); // Конфигурация порта на вход "Скорость" энкодера двигателя правого борта
}
// Основная программа Arduino, исполняется как бесконечный цикл
void loop()
{
// digitalWrite(Trig_Pin, HIGH); // Подаем импульс на вход Trig дальномера
// delayMicroseconds(10); // равный 10 микросекундам
// digitalWrite(Trig_Pin, LOW); // Отключаем
// impulseTime=pulseIn(Echo_Pin, HIGH); // Замеряем длину импульса
// distance_sm=impulseTime/58; // Пересчитываем в сантиметры
// Serial.print("Distance sm = "); // Вывод значения расстояния с ультразвукового дальномера в последовательный порт
// Serial.println(distance_sm); // Выводим на порт
// delay(100); // ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего.
// Это время называется периодом цикла (cycle period). Рекомендованный период между импульсами должен быть не менее 50 мс.
int valueBamp1 = digitalRead(Bamp1_Pin); // Считывается состояние датчика "пола" номер 1 и запись его в переменную
int valueBamp2 = digitalRead(Bamp2_Pin); // Считывается состояние датчика "пола" номер 2 и запись его в переменную
int valueOpt1 = digitalRead(Opt1_Pin); // Считывается состояние датчика "света" номер 1 и запись его в переменную
int valueOpt2 = digitalRead(Opt2_Pin); // Считывается состояние датчика "света" номер 2 и запись его в переменную
Serial.print("Bamp1 = "); // Вывод значения состояния датчика "пола" номер 1 в последовательный порт
Serial.println(valueBamp1); // Считыывние переменной со значением датчика "пола" номер 1 для вывода в последовательный порт
Serial.print("Bamp2 = "); // Вывод значения состояния датчика "пола" номер 2 в последовательный порт
Serial.println(valueBamp2); // Считыывние переменной со значением датчика "пола" номер 2 для вывода в последовательный порт
delay(500); // Ждем пол секунды
Serial.print("Opt1 = "); // Вывод значения состояния датчика "света" номер 1 в последовательный порт
Serial.println(valueOpt1); // Считыывние переменной со значением датчика "света" номер 1 для вывода в последовательный порт
Serial.print("Opt2 = "); // Вывод значения состояния датчика "света" номер 2 в последовательный порт
Serial.println(valueOpt2); // Считыывние переменной со значением датчика "света" номер 2 для вывода в последовательный порт
delay(500); // Ждем пол секунды
}
Текст программы обильно откомментирован и пока в нем только установка и обработка датчиков, да назначение выходов на драйверы. За управление моторами и логику обработки датчиков даже еще и не брался...