3d-scanner ASCII

art100
Offline
Зарегистрирован: 09.03.2014

мозги уже не работают

прошу помощи

шаговые моторы шагают, лазерные линии линеют, камеры камерят - от стартовой кнопки

косяк в ASCII обмене

задача

получить от софта по USB символы скажем G g Go go - начать процесс

когда деталь со всех сторон покажется дать софту символ скажем S s Stop - чтоб видео записал

Вопрос:

Кто видит косяк в обмене?

 

//art100 20140218 for laserscanner - USB - Arduino - liserline and L298 - Stepper Motor(1.8 gradus=1 step)
// G  ascii 71  Go    scanning (g ascii 103 test)
#include <Stepper.h> //for stepper chip L298
//const for myStepper library first
const int stepsmotor1 = 200;  // *1.8gradus/step = 360 gradus for stepper chip L298
const int stepsmotor2 = 200;  // *1.8gradus/step = 360 gradus for stepper chip L298
Stepper myStepper1(stepsmotor1, 4,5,6,7); // -L298-motor           
Stepper myStepper2(stepsmotor2, 8,9,10,11); // -L298-motor 
//pins
//serial pin            0
//serial pin            1
int led2 = 2; //laser green test
int led3 = 3; //laser red work 
//int led11             =11; // test 
int led12             =12; // test on shield
int led13             =13; // test led on board always
int but0 =A0; // no solder
int but1 =A1; // button motor1 up    -^-gnd
int but2 =A2; // button motor1 down  -^-gnd
int but3 =A3; // button motor2 up    -^-gnd
int but4 =A4; // button motor2 down  -^-gnd
int but5 =A5; // test on shield
//type
int temp00=1;
int temp01=1;
int temp02=1;
int temp03=1;
int temp04=1;
int temp05=1;
long step1Laser      = 200; //400step=0.9gradusa/step 200step =1.8gradusa/step 100step=3.6gradusa/step 
long step1Table      = 200; //400step=0.9gradusa/step 200step =1.8gradusa/step 100step=3.6gradusa/step  
int  commandusb        = 0; //
void setup() {
  Serial.begin(9600);    // open COM Port
  pinMode(led2,OUTPUT);  
  pinMode(led3,OUTPUT); 
  pinMode(but0,INPUT_PULLUP); 
  pinMode(but1,INPUT_PULLUP); 
  pinMode(but2,INPUT_PULLUP); 
  pinMode(but3,INPUT_PULLUP); 
  pinMode(but4,INPUT_PULLUP); 
  pinMode(but5,INPUT_PULLUP); 
  pinMode(led12, OUTPUT);  
  pinMode(led13, OUTPUT); 
  myStepper1.setSpeed(60);        // 60 rpm
  myStepper2.setSpeed(60);        // 60 rpm  
}
//====================================================================
void loop() {
  commandusb=0;  temp00=1;temp01=1;temp02=1;temp03=1;temp04=1;temp05=1;//
  temp01=digitalRead(but1);temp02=digitalRead(but2);temp03=digitalRead(but3);temp04=digitalRead(but4);temp05=digitalRead(but5);temp00=digitalRead(but0);

  if(temp01==0 || temp02==0 || temp03==0 || temp04==0){// || temp05==0){//temp00==0 || 
    digitalWrite(led2,  HIGH);delay(1);digitalWrite(led2, LOW); //green
    digitalWrite(led3,  HIGH);delay(1);digitalWrite(led3, LOW); //red  
    digitalWrite(led12, HIGH);delay(1);digitalWrite(led12, LOW);//shield red 
    digitalWrite(led13, HIGH);delay(1);digitalWrite(led13, LOW);//shield red 
    Serial.print("button press:"); Serial.print(temp00);Serial.print(temp01);Serial.print(temp02);Serial.print(temp03);Serial.print(temp04);Serial.print(temp05);
    Serial.println(";");
  }  //test
  
  //for stepper chip L298----------------------------------
  if(temp01==0){  myStepper1.step(+1);  Serial.println("temp01==0 button press myStepper1.step(+1)" );  }  //for stepper chip L298
  if(temp02==0){  myStepper1.step(-1);  Serial.println("temp02==0 button press myStepper1.step(-1)" );  }  //for stepper chip L298
  if(temp03==0){  myStepper2.step(+1);  Serial.println("temp03==0 button press myStepper2.step(+1)" );  }  //for stepper chip L298
  if(temp04==0){  myStepper2.step(-1);  Serial.println("temp04==0 button press myStepper3.step(-1)" );  }  //for stepper chip L298
  //for stepper chip L298----------------------------------


  //motor table motor laser ---------------------------------------------------------------- 
  int n=0; int m=0; int o=0;

  if (Serial.available() > 0) {   
    commandusb = Serial.read();
    Serial.print("commanda usb received: "); Serial.println(commandusb);
  }
  
  if (commandusb==71 || commandusb==103 || temp05==LOW) { // G  g
    Serial.println("G");
    for (o=0; o<8; o++) {                      // 360 gradus   

      for (m=0; m<step1Laser/8; m++) {         // 200step/8=25step 25step*1.8gradus/step = 45 gradus scanning low
        digitalWrite(led3, HIGH);               //laser on 
        myStepper2.step(+1);
        delay(1000);                            //for computer tormoz 1 sek
      } 
      Serial.println("T");
      for (m=0; m<step1Laser/8; m++) {         // 200step/8=25step 25step*1.8gradus/step = 45 gradus return
        digitalWrite(led3, LOW);
        myStepper2.step(-1);                   // laser up
        myStepper1.step(+1);                   // table 45 gradus
      } 
      
//      for (n=0; n<step1Table/8; n++) {         // 200step/8=25step 25step*1.8gradus/step = 45 gradus
//        myStepper1.step(+1);
//      }      
      delay(1000);                             //for computer tormoz 1   5 sek
    }
  }  
  //motor table motor laser ---------------------------------------------------------------- 
}
//==========================================

//------------------------------------------
//DEC Char  D   Ch  D   Ch D   Ch
//0  null   32  sp  64  @  96  ` 
//1         33  !   65  A  97  a 
//2         34  "   66  B  98  b 
//3         35  #   67  C  99  c 
//4         36  $   68  D  100 d 
//5         37  %   69  E  101 e 
//6         38  &   70  F  102 f 
//7         39  '   71  G  103 g 
//8         40  (   72  H  104 h 
//9  tab    41  )   73  I  105 i 
//10 line   42  *   74  J  106 j 
//11        43  +   75  K  107 k 
//12        44  ,   76  L  108 l 
//13 retur  45  -   77  M  109 m 
//14        46  .   78  N  110 n 
//15        47  /   79  O  111 o 
//16        48  0   80  P  112 p 
//17        49  1   81  Q  113 q 
//18        50  2   82  R  114 r 
//19        51  3   83  S  115 s 
//20        52  4   84  T  116 t 
//21        53  5   85  U  117 u 
//22        54  6   86  V  118 v 
//23        55  7   87  W  119 w 
//24        56  8   88  X  120 x 
//25        57  9   89  Y  121 y 
//26        58  :   90  Z  122 z 
//27        59  ;   91  [  123 { 
//28        60  <   92  \  124 | 
//29        61  =   93  ]  125 } 
//30        62  >   94  ^  126 ~ 
//31        63  ?   95  _  127   
//----------------------------------------

 

leshak
Offline
Зарегистрирован: 29.09.2011

Вы забыли упомянуть в чем же проблема состоит.

P.S. Для commandusb  более логично-экономным был бы тип byte или char
P.S.S. Мучатся с ASCII таблицей вручную - не обязательно. Компилятор уже знаком с ней. Поэтому выражение (commandusb==71) абсолютно идентично, с точки зрения компилятора, выражению (commandusb=='G'). А человеку читать/писать второе легче :)

art100
Offline
Зарегистрирован: 09.03.2014

строка 78

кнопкой предварительно запомненной в temp процессы стартуют хорошо

надо прилетевшую команду 71 услышать

 

if (commandusb==71 || commandusb==103 || temp05==LOW) { // G g

^^^^^^^^ команды пролетают мимо^^^^^^^^^кнопку отлавливаю и шагаем на ура ^^^^^^^^^^^

Serial.println("G");

 

:) с ASCII никто не мучается Вы в памяти помните соответсвие в таблице Ладно проехали - это памятка я всегда их в коде оставляю

art100
Offline
Зарегистрирован: 09.03.2014

P.S. сам увидел
по умолчанию терминала скорость 115200
а я чип торможу прошивая Serial.begin(9600); // open COM Port

надо будет подумать что лучше выбрать

в винде когда жмешь default ставиться 9600

все пошло
кроме хардварного подруливания и софтовый старт
arduino-вский терминал отвечает
temp01==0 button press myStepper1.step(+1)
button press:101111;
temp01==0 button press myStepper1.step(+1)
button press:101111;
temp01==0 button press myStepper1.step(+1)
commanda usb received: 103
G

И почему у меня все создается?

 

To Do:

надо будет дописать Stop для софта

кстати я не смотрел в прикладном софте по умолчанию

но что-то устал я на сегодня :(

пойду посплю

Хм

скорость обмена оказалась класическая 9600

а вот символ старта оказалась большая S

пойду точно посплю

пускай во сне мне приснится код для Ostanovki наверно

 

leshak
Offline
Зарегистрирован: 29.09.2011

>Вы в памяти помните соответсвие в таблице 

Кто вам такое сказал? Перечитайте еще раз что я написал. Я вам показал способ как не требуется запоминать коды и писать памятки. Как сделать что-бы код был "самочевиден".

>команды пролетают мимо

Сомневаюсь в этом. Мне кажется что если перезагрузить дуину. не нажимать кнопки. и послать G - то оно ее "словит". Первый раз. А вот дельше  уже возможны пропуски.

И уточните что означает "пролетауют". Что именно вы видете в логе?

art100
Offline
Зарегистрирован: 09.03.2014

commandusb=='G'

увидел
спасибо
все равно пойду спать
 
на данный моент все тип-топ
юстировку угла места отложу на потом
 
P.S. поругайте код
принимаю любую критику
 
аппаратно шаговые моторы 5 вольт мосфеты кнопки с запасом 6 штук (в дело пустил 5 подруливание по часовой/против подсвечивание вверх/вниз старт)
стол я думаю шагать на 360 градусов (думаю в будущем чуток меньше чем 360 будет достаточно)
лазерком подсвецивать думаю максимум 45 градусов (думаю в будущем 25 градусов может хватить с угол/ место еще не подобрал)
красный лазерок достаточно один
зеленый лазерок про запас как в софте предложен не думаю что нужен будет в будущем
ардуина с кучей мозгов Atmega328 места как футбольное поле для велосипеда
 
ToDo:
мосфет с что-то невнятно лазерок не зажег надо будет 
 
leshak
Offline
Зарегистрирован: 29.09.2011

>поругайте код

Да запросто:

- temp1,2,3 - это не именование переменых а "порнография".
- куча глобальных переменных которые спокойно могли бы быть локальными.
- куча использование int там где boolean или byte было-бы более чем достаточно (и более "говоряще по смыслу").
- куча использования delay(), которые потом "вылезут боком", когда захотите "останавливать по кнопке/команде".

art100
Offline
Зарегистрирован: 09.03.2014

leshak пишет:

>поругайте код

Да запросто:

- temp1,2,3 - это не именование переменых а "порнография".
- куча глобальных переменных которые спокойно могли бы быть локальными.

согласен

пока не знаю что локализовать

пока как на ассемблере флаги поднимаю

Цитата:

- куча использование int там где boolean или byte было-бы более чем достаточно (и более "говоряще по смыслу").

говорю памяти много

зачем на это время терять

Цитата:

- куча использования delay(), которые потом "вылезут боком", когда захотите "останавливать по кнопке/команде".

согласен

где вы думаете лучше заменить

в логику думаю только команду остановки ввести 

думаю просто добавить Serial.println("T"); в прикладном софте увидал чудо sTopscanning (а я думал пользовать TurnTable прикольно и нам будут говорить что наглийский самый известный язык)

думаю где-нибудь в 93 строке отчитываться прикладному софту

а потом можно будет отлаживать

 

Ругайте ругайте код

 

leshak
Offline
Зарегистрирован: 29.09.2011

>пока не знаю что локализовать

Ну а что тут знать? commandusb где-то кроме как внутри loop() используется? Ее значение между вызовами loop() требуется сохранять?  Нет. Ну так зачем "засорять глобальное простарство имен"?

>зачем на это время терять

Затем что это привыкание к "хорошему стилю". А осмысленный выбор типа КАЖДОЙ переменной, означает и более легкое чтение кода. Видно в каких пределах автор ожидает значение, лучше видно какой смысл автор вкладывает в переменную (наряду с хорошо подобранным именем переменной).

Да и вообще экономит часы на отлов багов возникших из-за привычки "назначать типы лишь бы компилировалось".

>где вы думаете лучше заменить

В идеале везде где есть delay(). Ну или хотя-бы где он в сумме дает задержки более чем десятки микросекунд.

>Ругайте ругайте код

Нагуглите книжку "Совершенный код", погуглите слова "Рефакторинг" и т.п. И "ругайте" сами :)

Вообщем открываете любую литературу на эту тему и начинаете слушать как звонят "все предупредительные звоночки".

- loop() - слишком большая. Явно хочет разбится на более мелкие функции (естественно с "Говорящими именами").
- Куча дублированного кода. Например:

//for stepper chip L298----------------------------------
  if(temp01==0){  myStepper1.step(+1);  Serial.println("temp01==0 button press myStepper1.step(+1)" );  }  //for stepper chip L298
  if(temp02==0){  myStepper1.step(-1);  Serial.println("temp02==0 button press myStepper1.step(-1)" );  }  //for stepper chip L298
  if(temp03==0){  myStepper2.step(+1);  Serial.println("temp03==0 button press myStepper2.step(+1)" );  }  //for stepper chip L298
  if(temp04==0){  myStepper2.step(-1);  Serial.println("temp04==0 button press myStepper3.step(-1)" );  }  //for stepper chip L298
  //for stepper chip L298----------------------------------

Четыре строки (а насамом деле, если красиво отформатировать, то 16-ть строк) которые в принципе делают "одно и тоже". Отличия - косметические. Вообщем "явный кандидат на рефакторинг".