Машинка Марсоход это возможно был самый первый проект на нашем сайте, 15 лет назад. К сожалению, тот проект довольно трудно повторить в настоящее время. Например, где взять два одинаковых шаговых двигателя от пятидюймовых жестких дисков? Это целая проблема. Но ведь идея-то проекта была интересная?
Попробуем реализовать его на новом уровне. Для этого, напечатаем разработанное нами шасси нового Марсохода на 3D принтере и соберём его, как написано вот здесь. Получится вот такая машинка, как на рисунке выше. 3D модели всех деталей есть на нашем гитхабе.
В качестве платы управления возьмем нашу плату MA3128. Я думаю, что этот же проект можно будет так же легко запустить и на других наших платах, например, используя плату Марсоход3GW2 или другие.
Проект для микросхемы Altera CPLD платы МА3128 в среде Altera Quartus II v13.0 я разместил на гитхабе https://github.com/marsohod4you/MA3128/tree/main/IR-ctrl-bot
Ну а дальше я расскажу чуть подробнее об этом проекте и в конце статьи будет его видео демонстрация.
Прежде всего, давайте расскажу о подсоединении платы MA3128 к драйверам двигателей 28BYJ-48.
На плате MA3128 есть 4 разъема для подключения шаговых двигателя типа 28BYJ-48. Вот эти разъемы:
Нас интересуют порты MA[3:0] и MB[3:0], а так же порт MD[3:0].
На каждом из разъёмов есть по 4 сигнала, которые подключаются к фазам шаговых двигателей, но так же есть и выводы питания +5V и Gnd..
На машинке Марсохода провода поключаются специальными проводами, которые нужно изготовить:
Используются два шестипроводных шлейфа. На фото видно, что к драйерам шаговых двигателей идут:
- светлокоричневый провод +5V
- синий провод Gnd
- красный, оранжевый, желтый и зеленый это 4 фазы для шагового двигателя.
Вот они подключены к драйверам шаговых двигателей:
Здесь видно, что синий и светло-коричневый идут на отдельный разъёмчик питания, а фазы идут на разъём микросхемы драйвера. Естественно, вы можете использовать другие цвета проводов.
Драйвера шаговых двигателей установлены на "втором этаже" машинки.
На машинку к порту MD_0 подключается выход микросхемы ILMS5360 - приёмник ИК команд от пульта дистанционного управления телевизора. Это будет импровизированная антенна Марсохода. На самом деле нет никаких причин выносить приёмник ИК сигнала повыше, но так машинка выглядит интереснее.
Микросхема приёмника ИК питается от напряжения +5В. На рисунке ниже оранжевый провод это сигнал датчика, сине-белый это Земля, а белый это +5В.
Чтобы проверить, что всё подключенно верно посмотрите на вырезку из документации на микросхему датчика ИК (выходной сигнал с краю особняком, Земля и питание рядом друг с другом, но Земля так же с краю.):
Еще важное замечание по поводу питания платы и машинки. Машинка питается от маленького пауэр банка, который выдаёт как раз +5В. Нужно сделать еще провод переходник из USB в разъём питания платы. И еще на последних платах MA3128 есть джампер, который позволяет подавать питание через микросхему регулятора прямо на ПЛИС платы. Так что джампер нужно закоротить.
Теперь немного расскажу о самом проекте. Код написан на Verilog HDL и на мой взгляд он максимально простой:
module max( input wire CLK, input wire CLK2, output wire [7:0]LED, input wire [1:0]KEY, output wire [3:0]MA, output wire [3:0]MB, output wire [3:0]MC, input wire [3:0]MD, //IR receiver attached here output wire [9:0]IOA, output wire [9:0]IOB, //Raspberry GPIO pins //inout wire [27:0]GPIO input wire SERIAL_RX, output wire SERIAL_TX ); assign IOA = 10'd00; assign IOB = 10'd00; assign SERIAL_TX = 1'b1; reg [20:0]cnt=0; always @(posedge CLK) cnt<=cnt+1; //80MHz / 2048 = 39062,5Hz wire clk39K; assign clk39K = cnt[11]; reg [1:0]ir_reg = 2'b00; always @(posedge clk39K) ir_reg <= { ir_reg[0], MD[0] }; reg [7:0]ir_cnt = 0; always @(posedge clk39K) if( ir_reg==2'b01 ) ir_cnt <= 0; else if( ir_cnt[6]==1'b0 ) ir_cnt <=ir_cnt+1; reg [31:0]cmd; reg [ 7:0]cmd_len = 0; always @(posedge clk39K) if( ir_reg==2'b10 ) begin if( ir_cnt==8'h40 ) cmd_len <=0; else cmd_len <= cmd_len+1; cmd <= { cmd[30:0], ((ir_cnt>8'h18)? 1'b1:1'b0) }; end reg motor0_ena=1'b0; reg motor0_dir=1'b0; reg motor1_ena=1'b0; reg motor1_dir=1'b0; always @(posedge clk39K) if( ir_reg==2'b01 && cmd_len==8'h20 ) begin if( cmd[7:0]==8'hF9 ) begin //forward motor0_ena <= 1'b1; motor0_dir <= 1'b1; motor1_ena <= 1'b1; motor1_dir <= 1'b1; end else if( cmd[7:0]==8'h79 ) begin //backward motor0_ena <= 1'b1; motor0_dir <= 1'b0; motor1_ena <= 1'b1; motor1_dir <= 1'b0; end else if( cmd[7:0]==8'hB9 ) begin //left motor0_ena <= 1'b1; motor0_dir <= 1'b0; motor1_ena <= 1'b1; motor1_dir <= 1'b1; end else if( cmd[7:0]==8'h59 ) begin //right motor0_ena <= 1'b1; motor0_dir <= 1'b1; motor1_ena <= 1'b1; motor1_dir <= 1'b0; end else if( cmd[7:0]==8'hE9 ) begin //stop motor0_ena <= 1'b0; motor0_dir <= 1'b0; motor1_ena <= 1'b0; motor1_dir <= 1'b0; end end assign LED = cmd[7:0]; motor motor_inst0( .clk(CLK), .enable( motor0_ena | (~KEY[0]) ), .dir( motor0_dir ), .cnt8( cnt[19:17] ), .f0( MA[0] ), .f1( MA[1] ), .f2( MA[2] ), .f3( MA[3] ) ); motor motor_inst1( .clk(CLK), .enable( motor1_ena | (~KEY[1]) ), .dir( motor1_dir ), .cnt8( cnt[19:17] ), .f0( MB[0] ), .f1( MB[1] ), .f2( MB[2] ), .f3( MB[3] ) ); endmodule
На плате стоит кварцевый генератор 80МГц и для работы проекта это слишком высокая частота. Поэтому она сразу делится на 2048 и получается рабочая частота около 39кГц.
Эта частота захватывает сигнал от микросхемы ILMS5360 из входа MD[0] и записывает в короткий сдвиговый регистр двухбитный ir_reg. Сдвиговый регистр позволяет определить моменты изменения входного сигнала.
В проекте есть восьмибитный счетчик ir_cnt, который сбрасывается при обнаружении фронта сигнала (ir_reg==2'b01) от ИК датчика ILMS5360 и начинает счет, но ограниченный по длительности. Это нужно, чтобы определить длительность импульса от ИК датчика. Требуется обнаружить короткий или длинный импульс.
А вот при обнаружении спада сигнала от датчика ИК (ir_reg=2'b10) обнаруженный бит, ноль если короткий импульс или единица, если длинный импульс, записывается в сдвиговый регистр cmd. Это 32х битный сдвиговый регистр, который накапливает код команды принятый от пульта дистанционного управления. Так же ведется подсчет принятых битов в счетчике cmd_len.
Когда принято 32 бита команды от пульта дистанционного управления, то устанавливаются соответствующие регистры отвечающие за включение шаговых двигателей. Есть регистры motor_ena0 и motor_ena1, которые отвечают за включение первого и второго шагового двигателя. Так же есть регистры отвечающие за направление вращения motor_dir0 и motor_dir1.
В программе так же имеется два экземпляра модулей motor, которые вырабатывают рабочие импульсы для шаговых двигателей.
Ну и еще скажу, что из 32х бит команды проверяется только последние 8 бит. Коды команд я захватил в плате Марсоход3GW2 с помощью инструмента GAO. Поэтому я теперь знаю точно какие там коды приходят от пульта дистанционного управления:
Теперь мне осталось только продемонстрировать машинку Марсоход и управление ею с помощью пульта ДУ:
Теперь, с нашим шасси, которое мы спроектировали во FreeCAD и которое можно напечатать на любом 3D принтере, надеюсь наши проекты машинок вы сможете очень легко повторить.
Подробнее...