Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Цифровая командная станция DCC Model Rail Arduino и бесплатное приложение

Компоненты и расходные материалы

SparkFun Arduino Pro Mini 328 - 5 В / 16 МГц
× 1
LMD18200t
× 1
PCB
× 1
Линейный регулятор (7805)
× 1
Стабилитрон 3,6 В 0,5 Вт
× 1
Конденсатор 220 мкФ
16 вольт
× 1
Конденсатор 10 мкФ
16 вольт
× 1
Керамический дисковый конденсатор, 0,1 мкФ
× 3
Резистор 10 кОм
× 2
Резистор в сквозное отверстие, 4,7 кОм
× 1
винтовой зажим 2 позиции по центру 3,5 мм, диаметр штифта 1,1 мм
× 1
винтовой зажим, 6 позиций, 2,54 мм, центры
× 1
4-контактный разъем 2,54 мм
× 1
12-контактный разъем 2,54 мм
× 2

Приложения и онлайн-сервисы

LocoMotive
Это бесплатная версия приложения
LocoMotive DCC
Это последняя версия, включая чтение / запись cv от 1 до 255

Об этом проекте

Чем отличается эта система?
Очень простая электронная схема обеспечивает сигнал DCC и питание для трека, однако реальную работу выполняет приложение! Компьютер на вашем телефоне используется в полной мере за счет создания кодов, необходимых для формирования каждого пакета инструкций, что упрощает работу контроллера Arduino!

Обновление от 16 августа 2019 г .:выпуск нового улучшенного приложения - с возможностью чтения / записи CV от 1 до 255
Эта версия приложения стоит 5 фунтов стерлингов плюс налог и продается в Google Play Store.

Обновление 18 мая 2019 г .:выпуск нового улучшенного приложения - до 28 функций с редактируемыми заголовками, видимостью и мгновенными параметрами. Управляйте до 4 локомотивов одновременно с помощью индикаторов скорости на экране. Эта версия приложения стоит 3 фунта стерлингов плюс налог и доступно в Google Play Store.

Обновление от 17 февраля 2019 г .:Возможно, вам придется изменить модуль Bluetooth HC-06, чтобы расширить диапазон приема. Я добавил сплошной медный провод (от заземляющего провода сети) длиной 31,2 мм (1/4 длины). длина волны для 2,4 ГГц). См. Прилагаемую фотографию на шаге 2.

Обновление от 29 января 2019 г .:добавлена ​​опция мгновенного действия на F2 и F3 для звуков рожка. Предустановленная максимальная скорость для каждого локомотива. Это наиболее эффективная командная станция DCC, которую можно построить. Никакая другая система не может сделать так много с таким небольшим количеством компонентов. Простая в сборке полностью функционирующая командная станция DCC с печатной платой, доступная на eBay, плюс требующая всего несколько частей. Приложение LocoMotive предназначено для работы на телефонах Android с версией 4.1 и выше. . Нет необходимости покупать какие-либо специальные системы, это автономное устройство, управляемое бесплатным приложением под названием «LocoMotive», работает с декодерами, совместимыми с NMRA. Эта система компилирует рабочие пакеты DCC в приложении, которые отправляются в интерфейс Arduino для объединения с тактовыми сигналами DCC. Купите эту печатную плату на eBay. Получите бесплатное приложение LocoMotive в Google Play Store. Функции включают:

  • Управление от 1 до 20 локомотивов.
  • Идеально подходит для макетов малого и среднего размера.
  • Нагрузка 2 А приводит в движение до 16 локомотивов OO / HO с использованием указанного Н-образного моста.
  • Добавьте h-мост, совместимый с более высоким током, чтобы увеличить допустимую нагрузку.
  • Защита от короткого замыкания
  • Автоматическое отключение по току, настраивается в коде Arduino.
  • Свет и направление
  • Функции с 1 по 8
  • Редактировать названия функций, видимость и мгновенное действие
  • Стрелка / точки / аксессуары обслуживает до 8 пар выходов
  • Изменить названия явки
  • Индивидуальное название ваших локомотивов и установка максимальной скорости для каждого.
  • Программирование локального адреса CV1
  • Чтение / запись CV от 1 до 255
  • Добавьте собственные дополнительные адреса
  • Выберите источник питания постоянного тока в соответствии с используемым масштабом (Z / N / OO / HO / O / G) от 12 до 20 В.

В дополнение к предыдущей работе над беспроводными системами DCC я разработал командную станцию ​​Bluetooth, связанную со схемой на базе Arduino приемника с модулем HC-06 BT и драйвером двигателя LMD18200 H-bridge, обеспечивающим ток 2 А

.

Общая стоимость запчастей составляет около 20 фунтов стерлингов с запчастями, приобретенными на eBay.

Шаг 1. Эскиз Arduino

Полный эскиз прилагается. Эта часть представляет собой код цикла и приемника данных. Приложение Android отправляет получателю полный пакет и декодируется здесь в массив данных. В зависимости от того, получено 3 или 4 байта, код сгенерирует правильный формат пакета DCC для железнодорожного пути.

void loop () {если (bluetooth.available ()> 0); {inString =bluetooth.readStringUntil ('\ n');} if (inString.substring (0, 1) =="D") {string ();} delay (20);}

Затем строка () void отделяет данные из полученной текстовой строки и помещает каждую инструкцию в соответствующую позицию в пакете DCC.

Например:

Полученная текстовая строка «DD, 3, 63, 12, 48» преобразуется в 4-байтовый пакет Speed ​​по 8 бит каждый:

DD =идентификатор сообщения Байт:[1] [2] [3] [4] Десятичный:[3] [63] [12] [48] Двоичный:[0000 0011] [0001 1111] [0000 1100] [0001 1000] Действие » :[Локомотив 3] [шаги скорости] [Скорость локомотива] [Проверка данных XOR]

Полученная текстовая строка «DD, 1, 129, 128» преобразуется в 3-байтовый пакет функций по 8 бит каждый:Десятичный:[1] [129] [128] Двоичный:[0000 0001] [1000 0001] [1000 0000] Действие:[Loco 1] [F1 on] [XOR data check]

Для получения дополнительной информации о стандарте пакетов NMRA см .:https://www.nmra.org/sites/default/files/s-9.2.1_2 ...

s-9.2.1_2012_07.pdf

LMD требует, чтобы сигнал DCC на выводе DIR, а вывод PWM находился в состоянии ВЫСОКОГО уровня.

command_station_bluetooth_oct_2018.ino

Шаг 2:Принципиальная схема Фритзинга

Arduino Pro Mini получает данные Bluetooth через модуль HC-06. Arduino генерирует стандартные тактовые циклы данных NMRA в пакетном формате. Полученные данные прерывают последовательность при получении новых данных, а пакет DCC обновляется для отправки инструкций на железнодорожные пути.

Список необходимых деталей:

Печатная плата доступна на eBay.

1 выкл. Arduino Pro Mini Atmega328P 5V / 16M eBay

1 шт. H-мост LMD18200T на eBay

1 шт. Модуль Bluetooth HC-06 на eBay

Металлопленочный резистор 0,1 Ом, 2 Вт, 0,1R, 2 Вт (11,5 мм x 4,5 мм), eBay

3 конденсатора 0,1 мкФ eBay

2 резистора 10 кОм на eBay

1 конденсатор 10 мкФ 25 В; eBay

1 конденсатор 220 мкФ 16 В; eBay

Phoenix Contact MKDS 1 / 2-3, 5 Клеммная колодка для печатной платы с 2 винтами, 13,5 А, 200 В, 3,5 мм, eBay

1 шт., Резистор 4,7 кОм, eBay

ИС регулятора положительного напряжения L7805 CV eBay

1 шт. 4-контактный разъем на краю заглушки, полоска 0,1 "2,54 мм eBay

2 12-контактных разъема с внутренней резьбой по краю заголовка, планка 0,1 "2,54 мм eBay

1 6-контактный универсальный винтовой клеммный блок 2,54 мм для печатной платы eBay

1 стабилитрон 3,6 В; 0,5 Вт 1N4732A eBay

Провод

Источник питания:для макетов OO / HO используйте источник питания постоянного тока 14 В (например, зарядное устройство для ноутбука от eBay). Например, он обеспечивает до 2,5 ампер. Проверьте размер розетки, устанавливаемой на панели, необходимой для подключения штекера постоянного тока к источнику питания, выбранному для этого проекта. https://www.ebay.co.uk/itm/Samsung-AC-DC-Adapter -...

Чтобы расширить диапазон действия модуля HC-06 Bt, припаяйте провод к концу антенны на модуле. Я использовал сплошной медный провод (от провода заземления сети) длиной 31,2 мм (1/4 длины волны для 2,4 ГГц). См. Фото выше. Обратите внимание - соединения HC-06 - это Rx (на плате) с Rx (на модуле) и Tx с Tx. Обратите внимание, что антенный провод должен быть покрыт оплеткой, чтобы избежать случайного замыкания с другими компонентами.

Для использования модуля h-моста LMD18200 (как показано выше, это модуль с радиатором и т. Д.) Я добавил компоненты измерения тока, чтобы обеспечить защиту от короткого замыкания или перегрузки на железнодорожном пути, обновленную принципиальную схему и Arduino. теперь код включает текущую функцию смысла.

Код ограничивает максимальный ток до 2 ампер при достижении, h-мост LMD18200 отключается путем подачи сигнала HIGH от D13 на Arduino на вход «Тормоз» на h-мосте.

Использование резистора измерения тока 0,1 Ом дает диапазон аналогового входа от 0 до 200 мВ на выводе A0 датчика Arduino для нагрузки до 2 А. Приблизительно 5 мВ на аналоговый шаговый вход (всего 1023 шага или деления) дает от 0 до 40 делений или 2 А / 40 =50 мА на деление. Точность измерения тока составляет 50 мА, однако мы защищаем h-мост при достижении 2 А. LMD18200 также имеет встроенную защиту от перегрева в качестве резервной. If (C> 2000) {// 2 ампера

Serial.println («Перегрузка по току»); digitalWrite (13, ВЫСОКИЙ); }

Значение текущего отрисовки отправляется в приложение Android через Bluetooth каждую секунду .void send_c () {t =millis () - lastmillis; если (t> =интервал) {bluetooth.write (sensorValue); bluetooth.write ('c'); lastmillis =millis (); }}

Шаг 3. Приложение для Android

Загрузите бесплатное приложение из магазина Google Play - LocoMotive

Загрузите полную версию приложения (£ 5,99) из магазина Google Play - «LocoMotive DCC»

Инструкции прилагаются к полной версии приложения.

Код

  • locomotive_dcc_sep19.ino
locomotive_dcc_sep19.ino Arduino
Код Arduino
 // 1 сен 2019 // эскиз для использования с Android-приложением Locomotive DCC с использованием h-bridge LMD18200 // добавлена ​​возможность чтения / записи CV # include  SoftwareSerial bluetooth (8,9); // RX TXint C; int sensorValue; long t =0; long lastmillis =0; long interval =1000; String inString; int a [8]; int preamable_type =0; int Address; float CV_VAL; float cv_val; float cv_val0; float cv_val1; float cv_val2; float cv_val3; float cv_val4; float cv_val5; float cv_val6; float cv_val7; int test_num; int cv_write_val; int Cs; boolean cv_logic; boolean ok; int num 6; // использовать для // Частота таймера составляет 2 МГц для (/ 8 предварительно масштабируется от 16 МГц) #define TIMER_SHORT 0x8D // Длина импульса 58 мкс #define TIMER_LONG 0x1B // Длина импульса 116 мкс без знака char last_timer =TIMER_SHORT; // сохраняем последнее значение таймера unsigned char flag =0; // используется для короткого или длинного импульса без знака char every_second_isr =0; // импульс вверх или вниз // определения для конечного автомата #define PREAMBLE 0 #define SEPERATOR 1 # define SENDBYTE 2unsigned char state =PREAMBLE; unsigned char preamble_count =16; unsigned char outbyte =0; unsigned char cbit =0x80; // переменные без знака char xdata =0, data =0, data_f =0, data_f1 =0, data_f2 =0; int locoAdr =9; // это адрес по умолчанию локомотива // буфера для commandstruct Message {unsigned char data [7]; unsigned char len;}; #define MAXMSG 3 // пока использовать только 2 сообщения - сообщение простоя, сообщение скорости локомотива, сообщение функции msgstruct Сообщение [MAXMSG] ={{{{0xFF, 0, 0xFF, 0, 0, 0, 0}, 3}, // idle msg {{locoAdr, 0, 0, 0, 0, 0, 0}, 3} // locoMsg со 128 шагами скорости 0x3f}; // Сообщение loco должно быть позже заполнено байтом данных о скорости и XOR int msgIndex =0; int byteIndex =0; // Настройка таймера2. // Настраивает 8-битный таймер 2 для генерации прерывания с указанной частотой. // Возвращает значение загрузки времени, которое должно быть загружено в TCNT2 внутри вашей процедуры ISR. // Настройки Timer2:Timer Prescaler / 8, mode 0 // Timmer clock =16MHz / 8 =2MHz or 0,5usec TCCR2A =0; TCCR2B =0 < =MAXMSG) {msgIndex =0; } byteIndex =0; // запускаем сообщение с байта 0} break; case SEPERATOR:flag =0; // длинный импульс // затем переход к следующему состоянию state =SENDBYTE; // перейти к следующему байту ... cbit =0x80; // отправляем этот бит в следующий раз first outbyte =msg [msgIndex] .data [byteIndex]; ломать; case SENDBYTE:if (outbyte &cbit) {flag =1; // отправляем короткий импульс} else {flag =0; // отправляем длинный импульс} cbit =cbit>> 1; if (cbit ==0) {// отправлен последний бит, есть ли следующий байт? byteIndex ++; if (byteIndex> =msg [msgIndex] .len) {// это уже был байт XOR, затем перейти к состоянию преамбулы =PREAMBLE; если (preamable_type ==0) {preamble_count =16; // нормальная длина преамбулы - 16 единиц} if (preamable_type ==1) {preamble_count =24; // преамбула из 24 '1 для записи CV1}} else {// отправляем разделитель и переход к следующему байту state =SEPERATOR; } } ломать; } if (flag) {// если данные ==1, то задержка короткого импульса =TCNT2; TCNT2 =задержка + TIMER_SHORT; last_timer =TIMER_SHORT; } else {// задержка длинного импульса =TCNT2; TCNT2 =задержка + TIMER_LONG; last_timer =TIMER_LONG; }}} void setup () {Serial.begin (115200); analogReference (ВНУТРЕННИЙ); pinMode (13, ВЫХОД); bluetooth.begin (9600); задержка (500); // ждем, пока модуль bluetooth запустится Serial.println ("Bluetooth Started"); bluetooth.println («Bluetooth запущен»); DDRD =B01100000; // регистр D5 для цифрового вывода 5, D6 для цифрового вывода 6 // Запуск таймера SetupTimer2 (); t =millis (); lastmillis =millis (); digitalWrite (6, LOW); digitalWrite (13, HIGH); // отключаем мост в выключенном состоянии int get_cv_val =cv_calc (test_num);} void current () {int i; int значение =0; int numReadings =5; for (i =0; i  2000) {// 2 ампера Serial.println ("Over Current"); bluetooth.println («Коротко!»); digitalWrite (6, LOW); // логическое управление сигналом DCC на низкий (выкл.) digitalWrite (13, HIGH); // тормозить, замыкает мост h-bridge o / p bluetooth.println (C); }} void loop () {if (bluetooth.available () ==true); {inString =bluetooth.readStringUntil ('\ n'); Serial.println (inString); } если (inString.substring (0,1) =="D") {строка (); } // входящий пакет DCC if (inString.substring (0,1) =="C") {digitalWrite (6, HIGH); digitalWrite (13, LOW); } // сброс после перегрузки по току, включение логического управления сигналом DCC, отключение тормоза if (inString.substring (0,1) =="G") {digitalWrite (6, HIGH); digitalWrite (13, LOW); Текущий(); bluetooth.println (C);} // запрос загрузки текущего значения if (inString.substring (0,1) =="A") {digitalWrite (6, HIGH); digitalWrite (13, LOW); get_cv_data (); cv1_prog (); digitalWrite (6, LOW); digitalWrite (13, HIGH);} если (inString.substring (0,3) =="получить") {cv_val =0; digitalWrite (6, ВЫСОКИЙ); digitalWrite (13, LOW); get_cv_num (); cv_read (); digitalWrite (6, LOW); digitalWrite (13, ВЫСОКИЙ); } если (inString.substring (0,3) =="добавить") {cv_write_val =0; digitalWrite (6, ВЫСОКИЙ); digitalWrite (13, LOW); get_cv_new_val (); repeat_cv_write (); digitalWrite (6, LOW); digitalWrite (13, ВЫСОКИЙ); } если (inString.substring (0,1) =="V") {задержка (50); bluetooth.print ("CV1 обновлен"); Serial.println (Address);} // запись cv1 if (inString.substring (0,1) =="E") {digitalWrite (6, LOW); // логическое управление сигналом DCC на низкий (выкл.) digitalWrite (13, HIGH); // тормозить, закорачивает h-мост o / p} // e-stop inString =""; } void get_cv_new_val () {Serial.println (inString); Строка cv_w =""; int x =inString.indexOf ("новый,") + 4; cv_w =inString.substring (x, x + 3); Serial.println (cv_w); cv_write_val =cv_w.toInt (); Serial.print ("cv_write_val:"); Serial.println (cv_write_val); Строка addr =""; int z =inString.indexOf ("адрес,") + 5; адрес =inString.substring (z, z + 1); Serial.println (адрес); Адрес =addr.toInt (); Serial.print ("Адрес:"); Serial.println (Адрес); } void get_cv_num () {cv_write_val =0; Serial.println (inString); String temp =""; int x =inString.indexOf (",") + 1; temp =inString.substring (x, 8); Serial.println (темп); Адрес =temp.toInt (); Serial.print ("Адрес:"); Serial.println (Адрес); } void get_cv_data () {беззнаковый длинный z =inString.length (); int y =0; int count =0; String inChar; String temp =""; для (int я =0; я <=z; я ++) {inChar =inString.substring (я, я + 1); if (inChar ==",") {count ++;} if (inChar! ="," &&inChar! ="A") {temp + =inChar;} if (inChar ==",") {Address =(temp .toInt ()); y =y +1; temp ="";}} change_len3 (msg [1]); Assembly_3_byte (); Serial.println (inString); } пустая строка () {беззнаковое длинное z =inString.length (); int y =0; для (int я =0; я <=5; я ++) {a [я] =0; } int count =0; Строка inChar; Строка temp =""; для (int я =0; я <=z; я ++) {inChar =inString.substring (я, я + 1); если (inChar ==",") {счет ++; } если (inChar! ="," &&inChar! ="D") {temp + =inChar; } если (inChar ==",") {a [y] =(temp.toInt ()); у =у +1; temp =""; }} if (count ==3) {//Serial.println(inString); // print_data (); изменить_len3 (сообщение [1]); Assembly_3_byte (); } if (count ==4) {//Serial.println(inString); // print_data (); изменить_len4 (сообщение [1]); Assembly_4_byte (); } //Serial.println(inString); //Serial.println(a[1]); // Serial.println (a [2]); //Serial.println(a[3]); //Serial.println(a[4]); // print_data (); } аннулированная поправка_len4 (структура сообщения &x) {x.len =4; //Serial.println(x.len);}бегите Assembly_4_byte () {preamable_type =0; // 16 x '1 noInterrupts (); msg [0] .data [0] =B11111111; msg [0] .data [1] =B00000000; msg [0] .data [2] =B11111111; msg [1] .data [0] =a [1]; msg [1] .data [1] =a [2]; msg [1] .data [2] =a [3]; msg [1] .data [3] =((a [1] ^ a [2]) ^ a [3]); interrupts ();} аннулируйте поправку_len3 (struct Message &x) {x.len =3; //Serial.println(x.len);}бегите Assembly_3_byte () {preamable_type =0; // 16 x '1 noInterrupts (); msg [0] .data [0] =B11111111; msg [0] .data [1] =B00000000; msg [0] .data [2] =B11111111; msg [1] .data [0] =a [1]; msg [1] .data [1] =a [2]; msg [1] .data [2] =(a [1] ^ a [2]); msg [1] .data [3] =0; прерывания (); } void print_data () {Serial.print (сообщение [1]. данные [0], DEC); Serial.print (","); Serial.print (msg [1] .data [1], DEC); Serial.print (","); Serial.print (msg [1] .data [2], DEC); Serial.print (","); Serial.print (msg [1] .data [3], DEC); Serial.println (","); } // CV readvoid cv_current () {for (int i =1; i <=10; i ++) {sensorValue =analogRead (A0); C =10,8 * значение датчика; // мА if (C> =Cs) {cv_logic =true; } delayMicroseconds (500); Serial.print ("C ="); Serial.println (C);}} void cv_read () {cv_val =0; задержка (200); Текущий(); если (bluetooth.available () ==true); {bluetooth.print ("чтение .."); } Cs =C + 50; CV_VAL =99; для (int f =1; f <=10; f ++) {если (CV_VAL ==99) {cv_val0 =cv_calc (0); задержка (10); }} CV_VAL =99; для (int f =1; f <=10; f ++) {если (CV_VAL ==99) {cv_val1 =cv_calc (1); задержка (10); }} CV_VAL =99; для (int f =1; f <=10; f ++) {если (CV_VAL ==99) {cv_val2 =cv_calc (2); задержка (10); }} CV_VAL =99; для (int f =1; f <=10; f ++) {если (CV_VAL ==99) {cv_val3 =cv_calc (3); задержка (10); }} CV_VAL =99; для (int f =1; f <=10; f ++) {если (CV_VAL ==99) {cv_val4 =cv_calc (4); задержка (10); }} CV_VAL =99; для (int f =1; f <=10; f ++) {если (CV_VAL ==99) {cv_val5 =cv_calc (5); задержка (10); }} CV_VAL =99; для (int f =1; f <=10; f ++) {если (CV_VAL ==99) {cv_val6 =cv_calc (6); задержка (10); }} CV_VAL =99; для (int f =1; f <=10; f ++) {если (CV_VAL ==99) {cv_val7 =cv_calc (7); задержка (10); }} Serial.print ("cv_val0"); Serial.println (cv_val0); Serial.print ("cv_val1"); Serial.println (cv_val1); Serial.print ("cv_val2"); Serial.println (cv_val2); Serial.print ("cv_val3"); Serial.println (cv_val3); Serial.print ("cv_val4"); Serial.println (cv_val4); Serial.print ("cv_val5"); Serial.println (cv_val5); Serial.print ("cv_val6"); Serial.println (cv_val6); Serial.print ("cv_val7"); Serial.println (cv_val7); int cv_val_total =cv_val0 + cv_val1 + cv_val2 + cv_val3 + cv_val4 + cv_val5 + cv_val6 + cv_val7; cv_val =0; если (cv_val0 ==1) {cv_val =cv_val + 1; } если (cv_val1 ==1) {cv_val =cv_val + 2; } если (cv_val2 ==1) {cv_val =cv_val + 4; } если (cv_val3 ==1) {cv_val =cv_val + 8; } если (cv_val4 ==1) {cv_val =cv_val + 16; } если (cv_val5 ==1) {cv_val =cv_val + 32; } если (cv_val6 ==1) {cv_val =cv_val + 64; } если (cv_val7 ==1) {cv_val =cv_val + 128; } if (bluetooth.available () ==true); {if (cv_val_total> 9) {bluetooth.print ("read =error"); } если (cv_val_total <9) {bluetooth.print ("read ="); bluetooth.println (int (cv_val + 0.5)); }} Serial.print ("cv_val"); Serial.println (int (cv_val + 0.5));} void cv1_prog () {for (int i =0; i <=3; i ++) {reset_packet (); задержка (5); } для (int я =0; я <=5; я ++) {page_preset_packet (); задержка (5); } для (int я =0; я <=9; я ++) {reset_packet (); задержка (5); } для (int я =0; я <=5; я ++) {cv1_write_packet (); задержка (5); } current (); для (int я =0; я <=10; я ++) {cv1_write_packet (); задержка (5); }} void reset_packet () {noInterrupts (); preamable_type =0; msg [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B00000000; msg [1] .data [1] =B00000000; msg [1] .data [2] =B00000000; interrupts ();} void page_preset_packet () {noInterrupts (); preamable_type =0; // 16 x '1 msg [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B01111101; msg [1] .data [1] =B00000001; msg [1] .data [2] =B01111100; interrupts ();} void cv1_write_packet () {preamable_type =1; // 24 x '1 noInterrupts (); msg [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B01111000; // Режим только адреса msg [1] .data [1] =B00000000 | Адрес; msg [1] .data [2] =(msg [1] .data [0] ^ msg [1] .data [1]); interrupts ();} void cv_verify1_packet () {noInterrupts (); preamable_type =1; // сообщение 24 x '1 [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B01111000; // режим битовой обработки msg [1] .data [1] =B00000000 | (Адрес 1); msg [1] .data [2] =B11101000 | число; msg [1] .data [3] =(msg [1] .data [0] ^ msg [1] .data [1]) ^ msg [1] .data [2]; прерывания (); } void cv_verify0_packet () {noInterrupts (); preamable_type =1; // сообщение 24 x '1 [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B01111000; // режим битовой обработки msg [1] .data [1] =B00000000 | (Адрес 1); msg [1] .data [2] =B11100000 | число; msg [1] .data [3] =(msg [1] .data [0] ^ msg [1] .data [1]) ^ msg [1] .data [2]; прерывания (); } void cv_write_packet () {preamable_type =1; // 24 x '1 noInterrupts (); msg [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B01111100; // режим записи msg [1] .data [1] =B00000000 | (Адрес 1); msg [1] .data [2] =B00000000 | cv_write_val; msg [1] .data [3] =(msg [1] .data [0] ^ msg [1] .data [1]) ^ msg [1] .data [2]; прерывания (); } void valid_packet () {noInterrupts (); msg [0] .data [0] =B11111111; msg [0] .data [1] =B00000000; msg [0] .data [2] =B11111111; preamable_type =0; // 16 x '1 msg [1] .data [0] =(Адрес - 1); msg [1] .data [1] =0x80; // locoMsg с инструкцией группы 1 0x80 msg [1] .data [2] =msg [1] .data [0] ^ msg [1] .data [1]; msg [1] .data [3] =0; interrupts ();} // CV writevoid repeat_cv_write () {current (); Cs =C + 50; Serial.print ("C ="); Serial.println (C); Serial.print ("Cs ="); Serial.println (Cs); если (bluetooth.available () ==true); {bluetooth.print ("писать .."); } ок =ложь; для (int f =1; f <=10; f ++) {если (ок ==ложь) {cv_write (); задержка (10); }}} void cv_write () {задержка (100); изменить_len3 (сообщение [1]); Assembly_3_byte (); задержка (5); для (int я =1; я <=20; я ++) {действительный_пакет (); задержка (5); } для (int я =1; я <=6; я ++) {reset_packet (); задержка (5); } cv_logic =false; изменить_len4 (сообщение [1]); Assembly_4_byte (); для (int я =1; я <=10; я ++) {cv_write_packet (); cv_current (); Serial.print ("C ="); Serial.println (C); если (cv_logic) {ок =истина; cv_logic =false; я =11; изменить_len3 (сообщение [1]); Assembly_3_byte (); для (int я =1; я <=10; я ++) {reset_packet (); задержка (5); } если (bluetooth.available () ==true); {bluetooth.print ("write ="); bluetooth.println (cv_write_val); Serial.print ("cv_write_val"); Serial.println (cv_write_val); }}} if (bluetooth.available () ==true); {if (ok ==false) {bluetooth.print ("write =error"); }}} int cv_calc (int test_num) {изменить_len3 (сообщение [1]); Assembly_3_byte (); задержка (5); для (int я =1; я <=20; я ++) {действительный_пакет (); задержка (5); } num =test_num; изменить_len3 (сообщение [1]); Assembly_3_byte (); для (int k =1; k <=4; k ++) {reset_packet (); задержка (5); } Edit_len4 (msg [1]); Assembly_4_byte (); cv_logic =false; задержка (2); для (int m =1; m <=5; m ++) {cv_verify1_packet (); cv_current (); если (cv_logic) {cv_logic =false; CV_VAL =1; Serial.print ("test_num ="); Serial.println (test_num); Serial.println (CV_VAL); preamable_type =0; изменить_len3 (сообщение [1]); Assembly_3_byte (); задержка (5); для (int j =1; j <=3; j ++) {reset_packet (); задержка (5); }}} Serial.println («тест на 0»); изменить_len3 (сообщение [1]); Assembly_3_byte (); для (int k =1; k <=4; k ++) {reset_packet (); задержка (5); } Edit_len4 (msg [1]); Assembly_4_byte (); cv_logic =false; задержка (2); для (int m =1; m <=5; m ++) {cv_verify0_packet (); cv_current (); если (cv_logic) {cv_logic =false; CV_VAL =0; Serial.print ("test_num ="); Serial.println (test_num); Serial.println (CV_VAL); preamable_type =0; изменить_len3 (сообщение [1]); Assembly_3_byte (); задержка (5); для (int j =1; j <=3; j ++) {reset_packet (); задержка (5); }}} Serial.println (CV_VAL); вернуть CV_VAL; } 

Изготовленные на заказ детали и корпуса

Полная цепь в корпусе

Схема

Схема приемника Bluetooth / H-мостового усилителя bluetooth_android_dcc_lmd18200_S8NTVsI4LY.fzzИнструкция приложения

Производственный процесс

  1. MrRobot - мобильное приложение Ubuntu с поддержкой робототехники (задействованы Raspberry Pi и arduino)
  2. 6-Shooter:станция для смешивания напитков Arduino
  3. Цифровые игральные кости Arduino
  4. Игровой контроллер Arduino
  5. ЖК-анимация и игры
  6. Умная обувь (автоматическая шнуровка и выработка электроэнергии)
  7. Сонар с использованием Arduino и отображение при обработке IDE
  8. Игра Pixel Chaser
  9. Управление яркостью светодиода с помощью Bolt и Arduino
  10. Портативная метеостанция Arduino (AWS) за 10 долларов