Страница 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 :freak: И больше ничего не происходит.

Код: Выделить всё

    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 и пытается вывести окошко :freak:
Тогда куда в ЕМС передать номер инструмента :thinking:

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.
конечно так делать нельзя :pssdoff:
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
Скопировал как выше, вставил изменил на свое. Больше ничего. Скинуть можно будет файл позже.