Этот проект - современная реализация нашего давнишнего проекта "Двигаться по полосе".
Основная цель этой работы - использовать новое шасси Марсохода, которое можно напечатать на 3D принтере, и использовать более распространённые шаговые двигатели 28BYJ-48. Мне кажется, что таким образом, этот простой проект будет легче повторить.
Для этого робота конечно понадобятся оптические датчики. Я делаю их из двух ИК-светодиодов и двух ИК-фототранзисторов по следующей схеме:
Как видите, к каждому датчику идет фактически три провода: Земля, питание ИК светодиода и вход от датчика. Получается всего шесть проводов, но два из них точно общие это Земля. Эти все сигналы я подключаю к порту IOA платы MA3128:
На рисунке выше синий провод - IOA[9] питание ИК светодода, фиолетовый IOA[8] - вход датчика, серый IOA[7] - вход вотрого датчика и белый это IOA[6] - питание второго ИК светодиода. Зелеый и черный провода объединены на Землю.
Шаговые моторчики 28BYJ-48, а точнее их драйвера, подключаются к портам MA[3:0] и MB[3:0], как и в проекте машинки управляемой от пульта ДУ.
Кроме этого, я на 3D принтере напечатал дополнительную деталь - держатель этих датчиков. Мои датчики устанавливаются в этот держатель:
А сам держатель датчиков я фиксирую на шасси машинки Марсоход снизу к отсеку батареи PowerBank:
Чувствительность датчиков можно немного регулировать если слегка наклонять сватодиоды в стороны. Тогда ИК луч будет отклонён в сторону и меньше его энергии будет возвращаться в фототранзистор.
Проект в CPLD Altera на плате MA3128 самый простой который можно придумать. Сигналы от оптических датчиков opto0 и opto1, когда на них не попадает возвращенный луч ИК это логическая единица. Фототранзистор закрыт. Когда луч ИК светодиода отражается от белой бумаги и возвращается к фототранзистору, то он открывается датчик даёт логический ноль. Эти сигналы инвертируются в проекте и фиксируются в регистрах opto0_r и opto1_r. А уже эти сигналы прямо идут на управление модулей шаговых двигателей:
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, inout 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[9] = 1'b1; wire opto1; assign opto1 = IOA[8]; wire opto0; assign opto0 = IOA[7]; assign IOA[6] = 1'b1; assign IOA[5:0] = 6'd00; assign IOB = 10'd00; assign SERIAL_TX = 1'b1; reg [20:0]cnt=0; always @(posedge CLK) cnt<=cnt+1; reg key0_r = 1'b1; reg key1_r = 1'b1; reg opto0_r = 1'b1; reg opto1_r = 1'b1; always @(posedge CLK) begin key0_r <= ~KEY[0]; key1_r <= ~KEY[1]; opto0_r <= ~opto0; opto1_r <= ~opto1; end assign LED = { 6'd00, opto1_r, opto0_r }; motor motor_inst0( .clk(CLK), .enable( opto0_r | key0_r ), .dir( 1'b1 ), .cnt8( cnt[19:17] ), .f0( MA[0] ), .f1( MA[1] ), .f2( MA[2] ), .f3( MA[3] ) ); motor motor_inst1( .clk(CLK), .enable( opto1_r | key1_r ), .dir( 1'b1 ), .cnt8( cnt[19:17] ), .f0( MB[0] ), .f1( MB[1] ), .f2( MB[2] ), .f3( MB[3] ) ); endmodule
Ну и конечно, видео демонстрация машинки двигающейся по полосе:
Попробуйте повторить этот проект - у вас точно получится. Все исходники этого проекта для платы MA3128 и САПР Altera Quartus II можно взять на гитхаб https://github.com/marsohod4you/MA3128/tree/main/Beam-ctrl-bot
Подробнее...