Страница 9 из 12
Re: HAL2Arduino
Добавлено: 15 янв 2014, 21:53
sr480
Там это не реализовано. Так что придется дописывать.
в файл program.ino
Код: Выделить всё
void processCommand(long command, long dataOne, long dataTwo)
{
if(command + dataOne + dataTwo != checksumOld){
if(command > 99 && command < 200){
if(command 108){
//тут пишешь код который нужно выполнить в переменной dataTwo будет храниться значение переданное из linuxCNC
}
А вот как работать с input'ами (данные которые заводятся в linuxCNC) я еще не разбирался. Вроде в методе void doIdleStuff() или void doUrgentStuff() нужно опрашивать порты ардины и по изменению значения (такая идеология работы протокола) отправлять в порт значение.
Для примера можно глянуть modLimSwitch.ino. Циклически в doUrgentStuff вызывается опрос портов checkSwitches(); Который опрашивает порты, проверяет изменилось ли значение и если изменилось, то строит сообщение следующего вида:
Nкоманды Значение КС;
Например: 113 1 114;
При этом КС = Nкоманды+значение
Думаю не сложно будет написать свой опрос, только начать лучше с дискретных пинов. Ато хер его знает как там парсер float'ов работает...
Re: HAL2Arduino
Добавлено: 15 янв 2014, 21:59
aftaev
sr480 писал(а)://тут пишешь код который нужно выполнить в переменной dataTwo будет храниться значение переданное из linuxCNC
Весь вечер сижу не догоняю что писать.
sr480 писал(а):Думаю не сложно будет написать свой опрос, только начать лучше с дискретных пинов.
так вот их и пробую приписать, хотябы один

Re: HAL2Arduino
Добавлено: 15 янв 2014, 22:35
sr480
в инициализацию порта (Setup) пишешь pinMode(myPin, OUTPUT); ну тоесть как обычно определяешь чтоб пин работал на выход.
myPin определи ногу в которую будешь 1 выдавать или 0.
Код: Выделить всё
if(command == 108)
{
digitalWrite(myPin, dataTwo);
}
тогда если в хал в пин 108 вернее то как он будет называться записать 1, то она должна будет выставиться и в порту.
Re: HAL2Arduino
Добавлено: 15 янв 2014, 22:58
aftaev
sr480 писал(а):digitalWrite(myPin, dataTwo);
это из ЕМС в Ардуину, а мне наоборот считать пин из Ардуины и записать в ЕМС
Мне нужно считать 5 пинов (бинарный галетный переключатель) перевести это в число(номер инструмента) и отправить это в ЕМС
И если правильно понимаю то нужно как то здесь
Код: Выделить всё
Serial.print("325 "); // команда
Serial.print(i); // параметр 8=номер инструмента
Serial.print(" ");
Serial.print(faultId[i][e]); //параметр непонятный
Serial.print(" ");
Serial.print(233+i+faultId[i][e]); //контрольная сумма
Serial.println(";");
Re: HAL2Arduino
Добавлено: 16 янв 2014, 09:52
sr480
В файл program.ino в самом начале определяешь на какие пины подключен галетный переключатель, номер сообщения, в котором будет передаваться информация о его состоянии (я написал от балды 701, тебе нужно чтоб в питоновском файле такой же был описан) и заводим переменную, в которой будем хранить информацию о предыдущем опросе:
Код: Выделить всё
#define gPin1 1 //Тут номера пинов, куда подключается переключатель
#define gPin2 2
#define gPin3 3
#define gPin4 4
#define gPin5 5
#define gPin6 6
#define toolNumberID 701 //Номер пина в сообщении, такой же должен быть описан в HAL.py файле
int lastTool = -1;
В void setup() добавляешь инициализацию портов:
Код: Выделить всё
pinMode(gPin1, INPUT);
pinMode(gPin2, INPUT);
pinMode(gPin3, INPUT);
pinMode(gPin4, INPUT);
pinMode(gPin5, INPUT);
pinMode(gPin6, INPUT);
В void doUrgentStuff() добавляем опрос порта, для этого читаем пины ардины, по какому-то условию их складываем и сравниваем с предыдущим значением, если оно изменилось, то отправляем в linuxCNC:
Код: Выделить всё
//Читаем положение переключателя
int curTool = digitalRead(gPin1) + digitalRead(gPin2) << 1 + digitalRead(gPin3) << 2 + digitalRead(gPin4) << 3 + digitalRead(gPin5) << 4 + digitalRead(gPin6) << 5;
if(curTool != lastTool)
{
lastTool = curTool; //Запоминаем номер инструмента
int checkSum = toolNumberID + curTool;
Serial.print(toolNumberID); //Номер сообщения
Serial.print(" ");
Serial.print(curTool); //номер инструмента
Serial.print(" ");
Serial.print(checkSum); //контрольная сумма
Serial.println(";");
}
Идеально потом отрефакторить код и в отдельном файле все написать (как их принято называть модуле).
Файл program во вложении.
Re: HAL2Arduino
Добавлено: 16 янв 2014, 10:09
aftaev
Сделал примерно как ты описал прописал как 313 команда. Прошил Ардуинку.
sr480 писал(а):#define toolNumberID 701 //Номер пина в сообщении, такой же должен быть описан в HAL.py файле
На Питоне (*.ру) застрял вернее ЕМС вешался

При загрузки ЕМС грузится и курсор меняется со стрелки на крест, как будто появляется невидимое окно. Возможно из-за этого hal_manualtoolchange.number

И больше ничего не происходит.
Код: Выделить всё
if codesAccepted.find("312") > -1:
if simulation == True:
print "creating: iocontrol_user-request-enable"
else:
print "makePins: creating: %r" % pinLabel
c.newpin("iocontrol_user-request-enable",hal.HAL_BIT,hal.HAL_IN)
if codesAccepted.find("313") > -1:
if simulation == True:
print "creating: iocontrol_user-request-enable"
else:
print "makePins: creating: %r" % pinLabel
c.newpin("hal_manualtoolchange.number",HAL_S32,hal.HAL_OUT)
....
....
....
if command == 304:
c['iocontrol_lube_level'] = val
if command == 306:
c['iocontrol_tool-changed'] = val
if command == 310:
c['iocontrol_tool-prepared'] = val
if command == 313:
c['hal_manualtoolchange.number'] = val
Re: HAL2Arduino
Добавлено: 16 янв 2014, 10:12
nkp
aftaev писал(а):При загрузки ЕМС грузится и курсор меняется со стрелки на крест, как будто появляется невидимое окно
скорее всего питон пытается ипортировать какой то модуль ,которого у тебя нет...
Re: HAL2Arduino
Добавлено: 16 янв 2014, 10:18
aftaev
hal_manualtoolchange.number посмотрел в сигналах ЕМС, он как IN значится. Нашел описание в инете здесь
http://www.linuxcnc.org/docs/2.4/html/h ... mples.html
гуру в ЕМС в ЛС объяснил примерно так:
hal_manualtoolchange просто выкидывает окошко и потом меняет номер инструмента.
Возможно hal_manualtoolchange.number и пытается вывести окошко
Тогда куда в ЕМС передать номер инструмента

Re: HAL2Arduino
Добавлено: 16 янв 2014, 10:27
sr480
А в HAL у тебя что написано? Пока вобще не привязываю к пинам linuxCNC, а просто в HAL мониторе посмотри верное значение от галетника приходит или нет. А потом уже можно думать к какому пину привязывать, я тут точно не подскажу, поскольку со сменой инструментов еще не разбирался.
Re: HAL2Arduino
Добавлено: 16 янв 2014, 10:31
aftaev
sr480 писал(а):А в HAL у тебя что написано?
Пока ничего.
sr480 писал(а):Пока вобще не привязываю к пинам linuxCNC, а просто в HAL мониторе посмотри верное значение от галетника приходит или нет.
а как оно к НАЛ попадет если вношу изменения в Питоне и ЕМС вешается

Нужно номер инструмента записать в какую нибудь переменную ХАЛ чтобы посмотреть.
Re: HAL2Arduino
Добавлено: 16 янв 2014, 10:53
sr480
Ну да ты только питон подключаешь, а пины не связываешь, и тогда можно смотреть пины HAL2Arduino в мониторе. Тогда не должно быть никаких окон.
Re: HAL2Arduino
Добавлено: 16 янв 2014, 10:58
aftaev
sr480 писал(а):Ну да ты только питон подключаешь, а пины не связываешь, и тогда можно смотреть пины HAL2Arduino в мониторе.
нужно обработать то что посылает Ардуина в ЕМС. Это делается в Питоне.
Стоит мне добавить это в Питоне
Код: Выделить всё
if codesAccepted.find("313") > -1:
if simulation == True:
print "creating: iocontrol_user-request-enable"
else:
print "makePins: creating: %r" % pinLabel
c.newpin("hal_manualtoolchange.number",HAL_S32,hal.HAL_OUT)
При запуске висит ЕМС. Если Питон не работает, смысл в Хал что либо прописывать думаю нет пока.
Re: HAL2Arduino
Добавлено: 16 янв 2014, 11:13
sr480
hal_manualtoolchange.number - а это не зарезервированное имя пина? Не пробовал иначе его назвать?
Тоесть этот кусок инициализирует сам пин, значит проблема не в связке с arduino.
Re: HAL2Arduino
Добавлено: 16 янв 2014, 11:16
aftaev
Вечером буду еще пробовать экспериментировать.
Re: HAL2Arduino
Добавлено: 16 янв 2014, 11:31
nkp
sr480 писал(а):hal_manualtoolchange.number - а это не зарезервированное имя пина? Не пробовал иначе его назвать?
Тоесть этот кусок инициализирует сам пин, значит проблема не в связке с arduino.
конечно так делать нельзя
c.
newpin - ты же создаешь
новый пин , значит имя должно быть оригинальным
а это имя уже есть
=========
да и забрось ты этот hal_manualtoolchange - тебе он не нужен...
Re: HAL2Arduino
Добавлено: 16 янв 2014, 13:08
Nick
Вешаться может от того, что ты в python убрал задержку в цикле, или делаешь что-то очень долгое и этот скрипт питона жрет весь процессор.
Покажи свой скрипт!
Re: HAL2Arduino
Добавлено: 16 янв 2014, 14:47
aftaev
Nick писал(а):Вешаться может от того, что ты в python убрал задержку в цикле,
задержки не трогал.
Re: HAL2Arduino
Добавлено: 16 янв 2014, 14:50
sr480
а пин переименовать пробовал?
Код: Выделить всё
if codesAccepted.find("313") > -1:
if simulation == True:
print "creating: iocontrol_user-request-enable"
else:
print "makePins: creating: %r" % pinLabel
c.newpin("i_toolNumber",HAL_S32,hal.HAL_OUT)
Re: HAL2Arduino
Добавлено: 16 янв 2014, 15:04
Nick
Скинь свой скрипт надо посмотреть, что ты там менял - не менял

!!!
Re: HAL2Arduino
Добавлено: 16 янв 2014, 15:11
aftaev
Nick писал(а): что ты там менял - не менял !!!
Код: Выделить всё
if codesAccepted.find("312") > -1:
if simulation == True:
print "creating: iocontrol_user-request-enable"
else:
print "makePins: creating: %r" % pinLabel
c.newpin("iocontrol_user-request-enable",hal.HAL_BIT,hal.HAL_IN)
Код: Выделить всё
if codesAccepted.find("313") > -1:
if simulation == True:
print "creating: iocontrol_user-request-enable"
else:
print "makePins: creating: %r" % pinLabel
c.newpin("hal_manualtoolchange.number",HAL_S32,hal.HAL_OUT)
....
....
....
Код: Выделить всё
if command == 310:
c['iocontrol_tool-prepared'] = val
Код: Выделить всё
if command == 313:
c['hal_manualtoolchange.number'] = val
Скопировал как выше, вставил изменил на свое. Больше ничего. Скинуть можно будет файл позже.