Принтер своими руками + Arduino. Можно ли использовать датчик положения? Многопоточность?
Я пытаюсь сделать управляемый компьютером плоттер/рисовальщик/ЧПУ, что-то вроде этого, из старого неисправного принтера... Я добрался до рабочего моторного щита, который может двигать скользящую тележку вперед и назад, запуская постоянный ток на короткое время и управляя шаговым двигателем, который будет «подавать бумагу». Но сейчас это просто несколько шестеренок и роликов.
1: Предположим, что я могу прикрепить механизм подачи бумаги к платформе, чтобы перемещать его в обоих направлениях X и Y, все еще нет способа сделать код Arduino многопоточным? В поисках этого я нашел результаты в некоторых очень старых руководствах/форумах, в которых говорилось, что это невозможно, но вы можете подделать это, сделав одно, а затем другое. Я хотел бы, чтобы последовательная команда отправляла Arduino команду «начать 3 мм вправо» и при этом запускала «3 мм вперед», например, для диагональной линии. Я запускал это только для команд, которые выполняются с перерывами и могут блокироваться, пока команда выполняется вот так.
2: Есть прозрачная «лента» с линиями на ней, которая проходит через скользящую тележку, и есть лента, выходящая из скользящей тележки, которая, как я предполагаю, является ссылкой, указывающей, что она находится на расстоянии x мм от конца, что позволяет принтеру видеть, как долго двигаться. Возможно ли будет провести обратную разработку этого типа устройства для использования в этом пользовательском приложении? Можно ли это сделать с помощью выхода осциллографа, подключенного к контактам на ленте?
@NoBugs, 👍-1
Обсуждение2 ответа
Вы можете выполнять несколькозадач на Arduino, выполняя некоторое время одну задачу, а затем некоторое время другую задачу и переключаясь таким образом туда и обратно.
Однако многие библиотеки Arduino, как правило, полагаются на блокирующие вызовы и не поддерживают возврат управления вызывающему коду, поэтому время, потраченное на вызовы delay()
, может быть использовано другим кодом.
Может ли он делать потоки ввода-вывода? Или, учитывая, как Serial.read()
работает с блокировкой, будет ли лучше отправить команду типа 'Left3 Forward4', а затем запустить их одновременно с start motor1, start motor2, end motor2, end motor 1?, @NoBugs
Управление серводвигателем осуществляется с помощью синхронизированной манипуляции выводами, последовательная связь автоматически заполняет буфер, из которого вытаскивается Serial.read(). Все это можно сделать без какой-либо блокировки., @ratchet freak
Я рекомендую использовать библиотеку AccelStepper (устанавливается через менеджер библиотек), которая позволит вам управлять несколькими шаговыми двигателями одновременно, не блокируя команды.
Возможно многопоточность на Arduino, но это сложная операция, которую вам на самом деле не нужно делать для этого приложения. Лучше вместо этого вызвать движение одного двигателя, затем следующего, в быстрой последовательности в вашем основном цикле. Библиотека AccelStepper как бы встраивает это, когда вы используете ее для управления на основе положения; вы сообщаете одному двигателю, куда двигаться, а затем запускаете
motor.run()
как можно чаще в цикле, чтобы фактически отправить команды вашему драйверу для его перемещения. (Вы также сообщаете другому двигателю о необходимости двигаться, а также запускаетеmotortwo.run()
так же часто, как иmotor.run()
в цикле; ни одна из команд не занимает много времени для выполнения.) Для точно скоординированных движений нескольких двигателей посмотрите на примерMultiStepper
, включенный в библиотеку, но обратите внимание, что то, что я описываю и реализовано в примере с похожим названиемMultipleSteppers
, подойдет вам.Что касается этой «прозрачной ленты», я подозреваю, что если вы посмотрите внимательно, то обнаружите, что на ней много очень узко расположенных черных и прозрачных полос. Она используется для передачи данных о положении обратно в драйвер двигателя. Скорее всего, у нее есть фотопрерыватель, который считывает ее движение. Вы можете считывать скорость (но не абсолютное положение) этой ленты, отслеживая прозрачные и черные участки, движущиеся через фотопрерыватель. Для более высокой точности данных, вероятно, необходимой, поскольку лента будет двигаться относительно быстро, вы, вероятно, захотите использовать функцию прерывания чипа, чтобы следить за тиками по мере их прохождения, что разработано для того, чтобы иметь приоритет над другими возможными одновременными операциями, которые выполняет чип.
Удачи с проектом!
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Вам действительно стоит изучить, как прошивки 3D-принтеров на базе Arduino (большинство из которых имеют открытый исходный код) решают эту проблему. Лента, которую вы описываете, является *инкрементальным* энкодером, поэтому она даст вам положение только в том случае, если вы посчитаете все изменения при движении от начального положения, определяемого чем-то другим, например, концевым выключателем., @Chris Stratton
Вы также можете рассмотреть возможность использования Grbl, программного обеспечения для управления в стиле ЧПУ. Это может помочь вам управлять вашими двигателями, поскольку оно будет работать с общим g-кодом, вместо того, чтобы изобретать язык самостоятельно., @computercarguy