Размер
Как я писал код для Arduino с помощью Python
Play

Как я писал код для Arduino с помощью Python

На днях появилась подработка, поступил заказ записать скетч на ардуино. Простенький, но объёмный. С повторяющимися блоками. Нужно было управлять каждым портом Arduino Mega отдельно, при получении команды по Uart. Отправляешь символ — и светодиод (к примеру) загорается на определенное время. Написал скетч на 2 команды, скинул заказчику для тестов, получил предоплату. Дальше, нужно было масштабировать на все порты.

Для начала я честно попробовал руками. Написав первые 26 #define, энтузиазм иссяк. Я пошел подышать свежим воздухом, и вспомнил, что у меня на ПК (Win 7 x64), уже установлен Python 3.6 из дистрибутива Anaconda. Кстати, это наиболее удобный способ установки Python`а на Windows, т.к. всё уже включено и настроено по умолчанию, и есть пакетный менеджер.

Итак, приступим. Создаем папку, в ней пустой файл, я назвал его «arduino_gen.py» и bat файл «start_py.bat» со следующим содержимым:

python.exe arduino_gen.py > code_out.txt @pause

Этот файл нам потребуется, для запуска программы на Python`е Теперь мы напишем программку, которая сгенерирует нам необходимый код для Arduino.

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

И две переменные, для перебора списков

И теперь создадим цикл для генерации #define PIN_a 2… #define PIN_Z 53

Сохраняем, запускаем файл «start_py.bat»

Если мы хотим вывести результат сразу в файл, тогда допишем:

python.exe arduino_gen.py > code_out.txt @pause

В результате, мы получим файл «code_out.txt » из которого, код удобно копировать в скетч в лучших традициях Arduino.

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

Далее, я приведу остальной код, в котором несложно разобраться. Но, для начала, рассмотрим

Здесь, нужно сгенерировать 4 блока кода в начале. И два блока в конце. В последствии, заказчик захотел изменить логику работы, чтобы при приходе заглавной буквы менялось состояние выхода. Я переписал участок кода:

И масштабировал при помощи Python'а

Вот, что в итоге получилось.

// Задаем пины #define PIN_a 2 #define PIN_b 3 #define PIN_c 4 #define PIN_d 5 #define PIN_e 6 #define PIN_f 7 #define PIN_g 8 #define PIN_h 9 #define PIN_i 10 #define PIN_j 11 #define PIN_k 12 #define PIN_l 13 #define PIN_m 14 #define PIN_n 15 #define PIN_o 16 #define PIN_p 17 #define PIN_q 18 #define PIN_r 19 #define PIN_s 20 #define PIN_t 21 #define PIN_u 22 #define PIN_v 23 #define PIN_w 24 #define PIN_x 25 #define PIN_y 26 #define PIN_z 27 #define PIN_A 28 #define PIN_B 29 #define PIN_C 30 #define PIN_D 31 #define PIN_E 32 #define PIN_F 33 #define PIN_G 34 #define PIN_H 35 #define PIN_I 36 #define PIN_J 37 #define PIN_K 38 #define PIN_L 39 #define PIN_M 40 #define PIN_N 41 #define PIN_O 42 #define PIN_P 43 #define PIN_Q 44 #define PIN_R 45 #define PIN_S 46 #define PIN_T 47 #define PIN_U 48 #define PIN_V 49 #define PIN_W 50 #define PIN_X 51 #define PIN_Y 52 #define PIN_Z 53

//Задаем время //Здесь, скорее всего, потребуется поправка //Например, 1 секунда может быть не 1000, а 865, к примеру. //Нужно будет секундомером померить, и, если необходимо, // уменьшить на некий коофициент #define TIME_a 1000 #define TIME_b 1000 #define TIME_c 1000 #define TIME_d 1000 #define TIME_e 1000 #define TIME_f 1000 #define TIME_g 1000 #define TIME_h 1000 #define TIME_i 1000 #define TIME_j 1000 #define TIME_k 1000 #define TIME_l 1000 #define TIME_m 1000 #define TIME_n 1000 #define TIME_o 1000 #define TIME_p 1000 #define TIME_q 1000 #define TIME_r 1000 #define TIME_s 1000 #define TIME_t 1000 #define TIME_u 1000 #define TIME_v 1000 #define TIME_w 1000 #define TIME_x 1000 #define TIME_y 1000 #define TIME_z 1000 #define TIME_A 1000 #define TIME_B 1000 #define TIME_C 1000 #define TIME_D 1000 #define TIME_E 1000 #define TIME_F 1000 #define TIME_G 1000 #define TIME_H 1000 #define TIME_I 1000 #define TIME_J 1000 #define TIME_K 1000 #define TIME_L 1000 #define TIME_M 1000 #define TIME_N 1000 #define TIME_O 1000 #define TIME_P 1000 #define TIME_Q 1000 #define TIME_R 1000 #define TIME_S 1000 #define TIME_T 1000 #define TIME_U 1000 #define TIME_V 1000 #define TIME_W 1000 #define TIME_X 1000 #define TIME_Y 1000 #define TIME_Z 1000

//логическое состояние светодиода (да / нет) boolean ledState_a = false; boolean ledState_b = false; boolean ledState_c = false; boolean ledState_d = false; boolean ledState_e = false; boolean ledState_f = false; boolean ledState_g = false; boolean ledState_h = false; boolean ledState_i = false; boolean ledState_j = false; boolean ledState_k = false; boolean ledState_l = false; boolean ledState_m = false; boolean ledState_n = false; boolean ledState_o = false; boolean ledState_p = false; boolean ledState_q = false; boolean ledState_r = false; boolean ledState_s = false; boolean ledState_t = false; boolean ledState_u = false; boolean ledState_v = false; boolean ledState_w = false; boolean ledState_x = false; boolean ledState_y = false; boolean ledState_z = false; boolean ledState_A = false; boolean ledState_B = false; boolean ledState_C = false; boolean ledState_D = false; boolean ledState_E = false; boolean ledState_F = false; boolean ledState_G = false; boolean ledState_H = false; boolean ledState_I = false; boolean ledState_J = false; boolean ledState_K = false; boolean ledState_L = false; boolean ledState_M = false; boolean ledState_N = false; boolean ledState_O = false; boolean ledState_P = false; boolean ledState_Q = false; boolean ledState_R = false; boolean ledState_S = false; boolean ledState_T = false; boolean ledState_U = false; boolean ledState_V = false; boolean ledState_W = false; boolean ledState_X = false; boolean ledState_Y = false; boolean ledState_Z = false;

//Переменные, для хранения времени int time_a = 0; int time_b = 0; int time_c = 0; int time_d = 0; int time_e = 0; int time_f = 0; int time_g = 0; int time_h = 0; int time_i = 0; int time_j = 0; int time_k = 0; int time_l = 0; int time_m = 0; int time_n = 0; int time_o = 0; int time_p = 0; int time_q = 0; int time_r = 0; int time_s = 0; int time_t = 0; int time_u = 0; int time_v = 0; int time_w = 0; int time_x = 0; int time_y = 0; int time_z = 0; int time_A = 0; int time_B = 0; int time_C = 0; int time_D = 0; int time_E = 0; int time_F = 0; int time_G = 0; int time_H = 0; int time_I = 0; int time_J = 0; int time_K = 0; int time_L = 0; int time_M = 0; int time_N = 0; int time_O = 0; int time_P = 0; int time_Q = 0; int time_R = 0; int time_S = 0; int time_T = 0; int time_U = 0; int time_V = 0; int time_W = 0; int time_X = 0; int time_Y = 0; int time_Z = 0;

void setup() < // не стал переписывать инициализацию Serial.begin(9600); for (int i = 2; i <= 53; i++) pinMode(i, OUTPUT); > void loop() < if (Serial.available() >0) < int x = Serial.read();

//Проверяем, что у нас пришло

//a if(x == 'a')

//b if(x == 'b')

//c if(x == 'c')

//d if(x == 'd')

//e if(x == 'e')

//f if(x == 'f')

//g if(x == 'g')

//h if(x == 'h')

//i if(x == 'i')

//j if(x == 'j')

//k if(x == 'k')

//l if(x == 'l')

//m if(x == 'm')

//n if(x == 'n')

//o if(x == 'o')

//p if(x == 'p')

//q if(x == 'q')

//r if(x == 'r')

//s if(x == 's')

//t if(x == 't')

//u if(x == 'u')

//v if(x == 'v')

//w if(x == 'w')

//x if(x == 'x')

//y if(x == 'y')

//z if(x == 'z') //Когда приходит большая буква — меняем состояние

//A if(x == 'A')

//B if(x == 'B')

//C if(x == 'C')

//D if(x == 'D')

//E if(x == 'E')

//F if(x == 'F')

//G if(x == 'G')

//H if(x == 'H')

//I if(x == 'I')

//J if(x == 'J')

//K if(x == 'K')

//L if(x == 'L')

//M if(x == 'M')

//N if(x == 'N')

//O if(x == 'O')

//P if(x == 'P')

//Q if(x == 'Q')

//R if(x == 'R')

//S if(x == 'S')

//T if(x == 'T')

//U if(x == 'U')

//V if(x == 'V')

//W if(x == 'W')

//X if(x == 'X')

//Y if(x == 'Y')

//Z if(x == 'Z')

> //a if(ledState_a == true)

if(time_a == 0)

if(ledState_a == false)

//b if(ledState_b == true)

if(time_b == 0)

if(ledState_b == false)

//c if(ledState_c == true)

if(time_c == 0)

if(ledState_c == false)

//d if(ledState_d == true)

if(time_d == 0)

if(ledState_d == false)

//e if(ledState_e == true)

if(time_e == 0)

if(ledState_e == false)

//f if(ledState_f == true)

if(time_f == 0)

if(ledState_f == false)

//g if(ledState_g == true)

if(time_g == 0)

if(ledState_g == false)

//h if(ledState_h == true)

if(time_h == 0)

if(ledState_h == false)

//i if(ledState_i == true)

if(time_i == 0)

if(ledState_i == false)

//j if(ledState_j == true)

if(time_j == 0)

if(ledState_j == false)

//k if(ledState_k == true)

if(time_k == 0)

if(ledState_k == false)

//l if(ledState_l == true)

if(time_l == 0)

if(ledState_l == false)

//m if(ledState_m == true)

if(time_m == 0)

if(ledState_m == false)

//n if(ledState_n == true)

if(time_n == 0)

if(ledState_n == false)

//o if(ledState_o == true)

if(time_o == 0)

if(ledState_o == false)

//p if(ledState_p == true)

if(time_p == 0)

if(ledState_p == false)

//q if(ledState_q == true)

if(time_q == 0)

if(ledState_q == false)

//r if(ledState_r == true)

if(time_r == 0)

if(ledState_r == false)

//s if(ledState_s == true)

if(time_s == 0)

if(ledState_s == false)

//t if(ledState_t == true)

if(time_t == 0)

if(ledState_t == false)

//u if(ledState_u == true)

if(time_u == 0)

if(ledState_u == false)

//v if(ledState_v == true)

if(time_v == 0)

if(ledState_v == false)

//w if(ledState_w == true)

if(time_w == 0)

if(ledState_w == false)

//x if(ledState_x == true)

if(time_x == 0)

if(ledState_x == false)

//y if(ledState_y == true)

if(time_y == 0)

if(ledState_y == false)

//z if(ledState_z == true)

📎📎📎📎📎📎📎📎📎📎