3d-scanner ASCII
- Войдите на сайт для отправки комментариев
Втр, 22/04/2014 - 11:34
мозги уже не работают
прошу помощи
шаговые моторы шагают, лазерные линии линеют, камеры камерят - от стартовой кнопки
косяк в 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 //----------------------------------------
Вы забыли упомянуть в чем же проблема состоит.
P.S. Для commandusb более логично-экономным был бы тип byte или char
P.S.S. Мучатся с ASCII таблицей вручную - не обязательно. Компилятор уже знаком с ней. Поэтому выражение (commandusb==71) абсолютно идентично, с точки зрения компилятора, выражению (commandusb=='G'). А человеку читать/писать второе легче :)
строка 78
кнопкой предварительно запомненной в temp процессы стартуют хорошо
надо прилетевшую команду 71 услышать
if (commandusb==71 || commandusb==103 || temp05==LOW) { // G g
^^^^^^^^ команды пролетают мимо^^^^^^^^^кнопку отлавливаю и шагаем на ура ^^^^^^^^^^^
Serial.println("G");
:) с ASCII никто не мучается Вы в памяти помните соответсвие в таблице Ладно проехали - это памятка я всегда их в коде оставляю
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 наверно
>Вы в памяти помните соответсвие в таблице
Кто вам такое сказал? Перечитайте еще раз что я написал. Я вам показал способ как не требуется запоминать коды и писать памятки. Как сделать что-бы код был "самочевиден".
>команды пролетают мимо
Сомневаюсь в этом. Мне кажется что если перезагрузить дуину. не нажимать кнопки. и послать G - то оно ее "словит". Первый раз. А вот дельше уже возможны пропуски.
И уточните что означает "пролетауют". Что именно вы видете в логе?
commandusb=='G'
>поругайте код
Да запросто:
- temp1,2,3 - это не именование переменых а "порнография".
- куча глобальных переменных которые спокойно могли бы быть локальными.
- куча использование int там где boolean или byte было-бы более чем достаточно (и более "говоряще по смыслу").
- куча использования delay(), которые потом "вылезут боком", когда захотите "останавливать по кнопке/команде".
>поругайте код
Да запросто:
- temp1,2,3 - это не именование переменых а "порнография".
- куча глобальных переменных которые спокойно могли бы быть локальными.
согласен
пока не знаю что локализовать
пока как на ассемблере флаги поднимаю
- куча использование int там где boolean или byte было-бы более чем достаточно (и более "говоряще по смыслу").
говорю памяти много
зачем на это время терять
- куча использования delay(), которые потом "вылезут боком", когда захотите "останавливать по кнопке/команде".
согласен
где вы думаете лучше заменить
в логику думаю только команду остановки ввести
думаю просто добавить Serial.println("T"); в прикладном софте увидал чудо sTopscanning (а я думал пользовать TurnTable прикольно и нам будут говорить что наглийский самый известный язык)
думаю где-нибудь в 93 строке отчитываться прикладному софту
а потом можно будет отлаживать
Ругайте ругайте код
>пока не знаю что локализовать
Ну а что тут знать? commandusb где-то кроме как внутри loop() используется? Ее значение между вызовами loop() требуется сохранять? Нет. Ну так зачем "засорять глобальное простарство имен"?
>зачем на это время терять
Затем что это привыкание к "хорошему стилю". А осмысленный выбор типа КАЖДОЙ переменной, означает и более легкое чтение кода. Видно в каких пределах автор ожидает значение, лучше видно какой смысл автор вкладывает в переменную (наряду с хорошо подобранным именем переменной).
Да и вообще экономит часы на отлов багов возникших из-за привычки "назначать типы лишь бы компилировалось".
>где вы думаете лучше заменить
В идеале везде где есть delay(). Ну или хотя-бы где он в сумме дает задержки более чем десятки микросекунд.
>Ругайте ругайте код
Нагуглите книжку "Совершенный код", погуглите слова "Рефакторинг" и т.п. И "ругайте" сами :)
Вообщем открываете любую литературу на эту тему и начинаете слушать как звонят "все предупредительные звоночки".
- loop() - слишком большая. Явно хочет разбится на более мелкие функции (естественно с "Говорящими именами").
- Куча дублированного кода. Например:
Четыре строки (а насамом деле, если красиво отформатировать, то 16-ть строк) которые в принципе делают "одно и тоже". Отличия - косметические. Вообщем "явный кандидат на рефакторинг".