Марсоход управляемый ИК-пультом

MarsohodBot2

Машинка Марсоход это возможно был самый первый проект на нашем сайте, 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. Вот эти разъемы:

ma3128 2 text

Нас интересуют порты MA[3:0] и MB[3:0], а так же порт MD[3:0].

На каждом из разъёмов есть по 4 сигнала, которые подключаются к фазам шаговых двигателей, но так же есть и выводы питания +5V и Gnd..

Conn schema

На машинке Марсохода провода поключаются специальными проводами, которые нужно изготовить:

connections

Используются два шестипроводных шлейфа. На фото видно, что к драйерам шаговых двигателей идут:

  1. светлокоричневый провод +5V
  2. синий провод Gnd
  3. красный, оранжевый, желтый и зеленый это 4 фазы для шагового двигателя.

Вот они подключены к драйверам шаговых двигателей:

conn drivers

Здесь видно, что синий и светло-коричневый идут на отдельный разъёмчик питания, а фазы идут на разъём микросхемы драйвера. Естественно, вы можете использовать другие цвета проводов.

Драйвера шаговых двигателей установлены на "втором этаже" машинки.

На машинку к порту MD_0 подключается выход микросхемы ILMS5360 - приёмник ИК команд от пульта дистанционного управления телевизора. Это будет импровизированная антенна Марсохода. На самом деле нет никаких причин выносить приёмник ИК сигнала повыше, но так машинка выглядит интереснее.

Микросхема приёмника ИК питается от напряжения +5В. На рисунке ниже оранжевый провод это сигнал датчика, сине-белый это Земля, а белый это +5В.

antenna

Чтобы проверить, что всё подключенно верно посмотрите на вырезку из документации на микросхему датчика ИК (выходной сигнал с краю особняком, Земля и питание рядом друг с другом, но Земля так же с краю.):

ilms5360

Еще важное замечание по поводу питания платы и машинки. Машинка питается от маленького пауэр банка, который выдаёт как раз +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. Поэтому я теперь знаю точно какие там коды приходят от пульта дистанционного управления:

samsung ir

Теперь мне осталось только продемонстрировать машинку Марсоход и управление ею с помощью пульта ДУ:

Теперь, с нашим шасси, которое мы спроектировали во FreeCAD и которое можно напечатать на любом 3D принтере, надеюсь наши проекты машинок вы сможете очень легко повторить.

 

Добавить комментарий