дешифратор step/dir

motorist828
Offline
Зарегистрирован: 12.07.2014

Здравствуйте, занимаюсь станком чпу и столкнулся с тем что программа выдаёт сигнал в формате степ/дир, а контроллера под него нету, но есть лишняя ардуино.

Сам я совсем новичёк и слабо понимаю код и не смогу его создать, хотя он в данном случае простой насколько я понимаю.

Собственно задача такая, есть 4 входа (по 2 на каждый канал) и 8 выходов (по 4 на канал), эти каналы независимы друг от друга.

Алгоритм работы одного канала: при подаче импульсов на вход степ, происходит поочерёдное переключение логической единицы на выходах (1-2-3-4-1-2-3-4..), при подаче логической единицы в этот момент на вход дир, переключение должно пойти в обратную сторону.

На выходе будут стоять ключи для управления униполярными двигателями и в итоге должен получится обычный контроллер на два канала.

Надеюсь что кто нибудь сможет помочь с прошивкой для такого.

motorist828
Offline
Зарегистрирован: 12.07.2014

Забыл написать, у меня ардуино уно.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Мдааа сам я ничего не понимаю, но понимаю что код просиой и на форуме просто толпа ничем не занятых людей, которые пишут код для всех желающих.

motorist828
Offline
Зарегистрирован: 12.07.2014

А разве форумы несозданы для того что бы люди помогали друг другу?

У меня самого форум по самодельным двс, я всегда помогаю новичкам, так как для меня это просто и быстро, а новичку придётся вникать в проблему часами а то и сутками за литературой, это конечно хорошо для саморазвития, но всё таки не рационально, когда есть те кто может помочь.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Помогать и сделать за вас эт разные вещи на мой взгляд. Что бы кто то сделал за вас, этому кому-то нужен как минимум какой то интерес в этом. Имхо

motorist828
Offline
Зарегистрирован: 12.07.2014

Нашёл то что мне надо на японском сайте http://spinelify.blog.fc2.com/blog-entry-33.html

Правда там под arduino mega 2560 и 3 канала, может кто доработать прошивку под уно или подсказать как это сделать?

Японский текст черег гугл переводчик если что легко читается.

Час пытался понять хотя бы распиновку, но так и не понял.. вот на фото выходу подключены в разьём PWM, но ведь там нет 17 контакта, на этом месте земля, если же 17 это ножка самой меги, то как тогда становится под вопросом нога 2 и 3, это ведь сигналные выводы TX RX и их вроде как нельзя для такого использовать...

/*MP4401 FETモジュールを利用したMACH3用自作基板のArdunio用デコードプログラム
 Dsub25Pinからのstep/dia信号をArduinoで受信し、MP4401のゲートに出力する。
 ステッピングモータはユニポーラ、XYZ軸用の3つを接続。
 0~5はSTEP/dia×3個の入力、6~17はゲート制御(4PIN*3=12PIN),18&19は空き 
 本プログラムはx軸とy軸に外部割り込み処理をしているためパルスの取りこぼしは無いはず。
 z軸はloopによる高速トレースで信号を読むため、取りこぼしの可能性がある。machのパルス幅は大きめに設定すること
*/ 
#define X1 17//モータの接続ポート
#define Y1 14
#define lX1 16
#define lY1 15
#define X2 13
#define Y2 10
#define lX2 12
#define lY2 11
#define X3 9
#define Y3 6
#define lX3 8
#define lY3 7

#define X_step 3
#define X_dia 4
#define Y_step 2
#define Y_dia 5
#define Z_step 0
#define Z_dia 1
//---------------------------------------------------------------------------------------------------------*/

//setup------------------------------------------------------------------------
void setup()
{
  pinMode(X1,OUTPUT);
  pinMode(lX1,OUTPUT);
  pinMode(Y1,OUTPUT);
  pinMode(lY1,OUTPUT);
  pinMode(X2,OUTPUT);
  pinMode(lX2,OUTPUT);
  pinMode(Y2,OUTPUT);
  pinMode(lY2,OUTPUT);
  pinMode(X3,OUTPUT);
  pinMode(lX3,OUTPUT);
  pinMode(Y3,OUTPUT);
  pinMode(lY3,OUTPUT);
  pinMode(18,INPUT);
  pinMode(19,INPUT);


  pinMode(X_dia,INPUT_PULLUP);
  pinMode(X_step,INPUT_PULLUP);
  pinMode(Y_dia,INPUT_PULLUP);
  pinMode(Y_step,INPUT_PULLUP);
  pinMode(Z_dia,INPUT_PULLUP);
  pinMode(Z_step,INPUT_PULLUP); 

//全軸動作テスト
  driveXp();
  driveYp();
  driveZp();
  delay(1000);
  driveXp();
  driveYp();
  driveZp();
  delay(1000);
  driveXp();
  driveYp();
  driveZp();
  delay(1000);
  driveXp();
  driveYp();
  driveZp();
  delay(1000);

//外部割込み開始
  attachInterrupt(1, X_FALLING, FALLING);
  attachInterrupt(0, Y_FALLING, FALLING);
}

void X_FALLING(){
  if(digitalRead(X_dia))driveXp();
  else driveXm();
}
void Y_FALLING(){
  if(digitalRead(Y_dia))driveYm();
  else driveYp();
}
//main-------------------------------------------------------------------------
void loop(){
  /* if(!digitalRead(Z_step)){//LOWなら
   if(digitalRead(Z_dia)){
   driveZp();
   }
   else{
   driveZm();
   }
   while(!digitalRead(Z_step)){
   }
   }
   */
}

byte t1=1; //x軸の回転ステップ位置の保持
byte t2=1;//y軸の回転ステップ位置の保持
byte t3=1;//z軸の回転ステップ位置の保持

//2層励磁------------
void driveXp(){//pはプラスの意味
  switch(t1){//2相励磁
  case 1:
    digitalWrite(lY1,LOW);
    digitalWrite(X1,HIGH);
    t1=2;
    break;
  case 2:
    digitalWrite(X1,LOW);
    digitalWrite(Y1,HIGH);
    t1=3;
    break;
  case 3:
    digitalWrite(Y1,LOW);
    digitalWrite(lX1,HIGH);
    t1=4;
    break;
  case 4:
    digitalWrite(lX1,LOW);
    digitalWrite(lY1,HIGH);
    t1=1;
    break;
  }
}
void driveXm(){//mはマイナスの意味
  switch(t1){
  case 1:
    digitalWrite(lY1,LOW );
    digitalWrite(lX1,HIGH);
    t1=4;
    break;
  case 2:
    digitalWrite(X1,LOW);
    digitalWrite(lY1,HIGH);
    t1=1;
    break;
  case 3:
    digitalWrite(Y1,LOW);
    digitalWrite(X1,HIGH);
    t1=2;
    break;
  case 4:
    digitalWrite(lX1,LOW);
    digitalWrite(Y1,HIGH);
    t1=3;
    break;
  }
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void driveYp(){
  switch(t2){
  case 1:
    digitalWrite(lX2,LOW);
    digitalWrite(X2,HIGH);
    t2=2;
    break;
  case 2:
    digitalWrite(lY2,LOW);
    digitalWrite(Y2,HIGH);
    t2=3;
    break;
  case 3:
    digitalWrite(X2,LOW);
    digitalWrite(lX2,HIGH);
    t2=4;
    break;
  case 4:
    digitalWrite(Y2,LOW);
    digitalWrite(lY2,HIGH);
    t2=1;
    break;
  }
}

void driveYm(){
  switch(t2){
  case 1:
    digitalWrite(lY2,LOW );
    digitalWrite(Y2,HIGH);
    t2=4;
    break;
  case 2:
    digitalWrite(X2,LOW);
    digitalWrite(lX2,HIGH);
    t2=1;
    break;
  case 3:
    digitalWrite(Y2,LOW);
    digitalWrite(lY2,HIGH);
    t2=2;
    break;
  case 4:
    digitalWrite(lX2,LOW);
    digitalWrite(X2,HIGH);
    t2=3;
    break;
  }
}

void driveZp(){
  switch(t3){
  case 1:
    digitalWrite(X3,HIGH);
    digitalWrite(lY3,LOW);
    t3=2;
    break;
  case 2:
    digitalWrite(Y3,HIGH);
    digitalWrite(X3,LOW);
    t3=3;
    break;
  case 3:
    digitalWrite(lX3,HIGH);
    digitalWrite(Y3,LOW);
    t3=4;
    break;
  case 4:
    digitalWrite(lY3,HIGH);
    digitalWrite(lX3,LOW);
    t3=1;
    break;
  }
}
void driveZm(){
  switch(t3){
  case 1:
    digitalWrite(lX3,HIGH);
    digitalWrite(lY3,LOW);
    t3=4;
    break;
  case 2:
    digitalWrite(lY3,HIGH);
    digitalWrite(X3,LOW);
    t3=1;
    break;
  case 3:
    digitalWrite(X3,HIGH);
    digitalWrite(Y3,LOW);
    t3=2;
    break;
  case 4:
    digitalWrite(Y3,HIGH);
    digitalWrite(lX3,LOW);
    t3=3;
    break;
  }
}
//----------------------------------------------------------------------------

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Почему нельзя? И как у вас пин 17 стал землей?

motorist828
Offline
Зарегистрирован: 12.07.2014

да про 17 ногу я чото не то сказал...  однако не сходится, на фото совершенно другие пины используются для выхода http://blog-imgs-56.fc2.com/s/p/i/spinelify/IMG_7061.jpg

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

А не нужно смотреть на фото. Читайте описание в программе. Там все написано. Входящие пины и исходящие. Что вам еще нужно?

motorist828
Offline
Зарегистрирован: 12.07.2014

А как входы и выходы под ардуино уно переименовать? Для дижитал просто цифру, а для аналога перед ней буква А ставить? 

И зачем там 18 и 19 вывод, можно ли их удалить для сохранения 3 каналов?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Я не вижу 18 и 19. Я вижу 5 входов и 12 выходов. И они все цифровые.

motorist828
Offline
Зарегистрирован: 12.07.2014

А по моему тут таки 6 входов, либо я считать разучился  

#define X_step 3
#define X_dia 4
#define Y_step 2
#define Y_dia 5
#define Z_step 0
#define Z_dia 1

И этот отрывок кода вроде как тоже обозначает какие то пины 

pinMode(18,INPUT);
pinMode(19,INPUT);

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Ну 6 входов, очепятался. 18 и 19 нигде не используют.
Можете заменить их на любые какие вам нравиться.

motorist828
Offline
Зарегистрирован: 12.07.2014

3 раза менял, признаков жизни не подаёт вообще

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

А как должны выглядеть признаки жизни?

motorist828
Offline
Зарегистрирован: 12.07.2014

Решил проблему спец прошивкой под старую версию программы Grbl

Joiner
Offline
Зарегистрирован: 04.09.2014

motorist828 пишет:

Решил проблему спец прошивкой под старую версию программы Grbl

Уважаемый motorist828, как можно с Вами связаться? Есть небольшой вопрос.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
Есть спецмикруха - L297 - транслятор сигналов "ШАГ/НАПРАВЛЕНИЕ" ("SEEP/DIR") в сигналы управления шаговым двигателем - полный шаг и полушаг.  
 

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Есть и поновее разные микросхемы.... А есть готовые платы, их там 5 штук. На спор- никогда сами на сделаете такое

http://www.banggood.com/3D-Printer-Kit-RAMPS-1_4-Control-Board-5Pcs-4988...

motorist828
Offline
Зарегистрирован: 12.07.2014

0