Я уже как-то писал про свой хобби проект Marble Machine - это такая штука, напечатанная на 3D принтере. Машина перемещает металлические шары, поднимает их вверх на подъемниках и потом они скатываются по желобам вниз. Недавно сделал вторую версию этой электро-маханической машины. Теперь здесь два подъемника, а значит используются два шаговых двигателя. Кроме того, теперь здесь есть электро-магнитный кран. Катушка взята из первого попавшегося под руки автомобильного рэле. Катушка подключается через драйвер двигателя, такой же, какой используется для шаговых двигателей.
На видео выше демонстрация этой машины. Завораживающее зрелище получается. Ниже расскажу, как я делал проект FPGA для платы управления Марсоход3bis.
Вот так выглядит машина сзади, столько проводов уже!
Поскольку проводов для управления становится все больше и больше, мне нужна FPGA плата с большим числом IO выводов. Пока использую плату Марсоход3bis с FPGA Intel MAX10. Проект сделан в Quartus Prime Lite.
Электро-магнитный кран должен включать соленоид в нижнем положении, подбирать/примагничивать шары и тащить их вверх. В верхнем положении нужно отключить соленоид, чтобы сбросить шары на улавливатель, который потом ведет на триггер-переключатель направления качения шаров.
Чтобы реализовать эту логику я установил на стойке крана геркон, а на подвижной штанге крана приклеил магнит, думаю их видно хорошо:
Плата должна определить момент замыкания контакта в герконе и остальные события отсчитываются от этого момента времени по количеству шагов шагового двигателя.
Получается, что модуль управления электро-магнитом тесно связан с модулем управления шагового двигателя. Вот я и объединил эту логику в одном Verilog модуле.
module motor(
input wire clk,
input wire sensor,
output reg f0,
output reg f1,
output reg f2,
output reg f3,
output reg solenoid
);
reg [2:0]cnt = 0;
always @(posedge clk)
cnt <= cnt+2'b01;
always @(posedge clk)
begin
f3 <= cnt==0 || cnt==1 || cnt==7;
f2 <= cnt==1 || cnt==2 || cnt==3;
f1 <= cnt==3 || cnt==4 || cnt==5;
f0 <= cnt==5 || cnt==6 || cnt==7;
end
reg r_sensor;
always @(posedge clk)
r_sensor <= ~sensor;
localparam TIMEOUT = 2500;
reg [16:0]solenoid_cnt;
always @( posedge clk )
if( r_sensor & (solenoid_cnt>=TIMEOUT) )
solenoid_cnt <= 0;
else
if( solenoid_cnt<TIMEOUT )
solenoid_cnt <= solenoid_cnt + 1;
always @( posedge clk )
solenoid <= (solenoid_cnt<TIMEOUT);
endmodule
Геркон поключен одним выводом к IO19 платы Марсоход3bis, а вторым выводом на землю. При этом вывод IO19 имеет настройку Weak pull-up resistor, то есть подтянут к VCC внутри FPGA. Поэтому в спокойном состоянии на входе IO19 логическая единица. При срабатывании геркона, когда к нему поднесен постоянный магнит, контакты внутри него замыкаются и IO19 оказывается подключенным к земле, то есть на входе оказывается логический ноль. Необходимо однако иметь в виду, что такие контакты могут иметь многочисленные срабатывания в момент включения. Такое явление называется "дребезг контактов". В моем случае для этой Marble Machine это не существенно.
Чтобы не использовать "обратную логику" сигнал sensor инвертируется и записывается в регистр r_sensor. Теперь легче думать: в r_sensor единица, когда сработал геркон. Дальше все понятно: после появления положительного сигнала в r_sensor сбрасывается счетчик solenoid_cnt и дальше начинает считать, пока не выйдет таймаут. По таймауту соленоид выключается. Значение таймаута выбрано экспериментальным путем.
Топ модуль проекта выглядит вот так:
Используются два абсолютно одинаковых модуля motor, но только один из этих модулей управляет соленоидом.
О механике проект можно почитать в моей статье на хабре:
Проектирование Электро-Механической Marble Machine v2.0
Я надеюсь и дальше развивать свою Marble Machine, но думаю придется наверное переходить уже на плату Marsohod2RPI, ведь там то еще больше IO выводов. Можно будет подключить еще больше моторов, сделать больше подъемников и спусков.
Можно ли все это повторить в микроконтроллерах? Несомненно можно, но мне проще в FPGA. Я всего лишь хочу сказать, что технология FPGA вполне удобан и применима и в простых хобби проектах.
Подробнее...