Beam-робот

beam bot

Этот проект - современная реализация нашего давнишнего проекта "Двигаться по полосе".

Основная цель этой работы - использовать новое шасси Марсохода, которое можно напечатать на 3D принтере, и использовать более распространённые шаговые двигатели 28BYJ-48. Мне кажется, что таким образом, этот простой проект будет легче повторить.

Для этого робота конечно понадобятся оптические датчики. Я делаю их из двух ИК-светодиодов и двух ИК-фототранзисторов по следующей схеме:

opto sensor

Как видите, к каждому датчику идет фактически три провода: Земля, питание ИК светодиода и вход от датчика. Получается всего шесть проводов, но два из них точно общие это Земля. Эти все сигналы я подключаю к порту IOA платы MA3128:

sensor ioa

На рисунке выше синий провод - IOA[9] питание ИК светодода, фиолетовый IOA[8] - вход датчика, серый IOA[7] - вход вотрого датчика и белый это IOA[6] - питание второго ИК светодиода. Зелеый и черный провода объединены на Землю.

Шаговые моторчики 28BYJ-48, а точнее их драйвера, подключаются к портам MA[3:0] и MB[3:0], как и в проекте машинки управляемой от пульта ДУ.

Кроме этого, я на 3D принтере напечатал дополнительную деталь - держатель этих датчиков. Мои датчики устанавливаются в этот держатель:

sensors

А сам держатель датчиков я фиксирую на шасси машинки Марсоход снизу к отсеку батареи PowerBank:

sensor2body

Чувствительность датчиков можно немного регулировать если слегка наклонять сватодиоды в стороны. Тогда ИК луч будет отклонён в сторону и меньше его энергии будет возвращаться в фототранзистор.

Проект в 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

 

 

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