tag:blogger.com,1999:blog-8944086625767573647.post1833579329048241497..comments2023-11-01T18:05:54.861+03:00Comments on Arduino, MK-90 и другие: Уроки Wiring (4)idhttp://www.blogger.com/profile/11932466603117832284noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-8944086625767573647.post-92169598676970179132015-10-12T11:30:44.939+03:002015-10-12T11:30:44.939+03:00Тут не всё так однозначно, #define действительно в...Тут не всё так однозначно, #define действительно выполняет подстановку перед компиляцией, но смотреть надо на то, что получается в результате этой самой подстановки. Ардуино работает на <a href="https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D1%80%D0%B2%D0%B0%D1%80%D0%B4%D1%81%D0%BA%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0" rel="nofollow">гарвардской архитектуре</a>, а значит память программ и данных - это аппаратно два различных устройства. Памяти данных обычно мало, и если есть задача использовать её экономно, а объявление переменной приводит к выделению лишней ячейки в памяти - это хуже, чем если просто использовать в коде константу - опять-таки, если эта константа помещается в память программ. Все эти "если" - допущения относительно того, как наш скетч компилируется в ассемблерные инструкции. И я еще могу предположить, что переменную можно разместить во внутреннем регистре, но числовую константу, которая по своей сути неизменна, пихать куда-то помимо памяти программ просто так компилятор не будет.idhttps://www.blogger.com/profile/11932466603117832284noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-76715589038992014052015-10-11T23:30:52.703+03:002015-10-11T23:30:52.703+03:00Я бы не был столь категоричен в утверждении, что d...Я бы не был столь категоричен в утверждении, что define якобы экономит память. Например, если мы опишем строку через define, то в код она будет включена столько раз, сколько раз мы ее используем, а если как переменную, то только один раз.Anonymoushttps://www.blogger.com/profile/04488422615840278873noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-35973783291295915822015-04-08T19:11:30.249+03:002015-04-08T19:11:30.249+03:00Чтобы понять, надо посмотреть определение: typedef...Чтобы понять, надо посмотреть определение: <br><br>typedef unsigned char uint8_t;<br><br>Но не советую использовать это в скетчах - пользуйтесь <b>byte</b>. Исчерпывающе про этот тип можно прочитать в стандарте ISO/IEC 9899:1999, раздел 7.18 "Integer types".idhttps://www.blogger.com/profile/11932466603117832284noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-61071898485587687872015-04-08T12:42:50.768+03:002015-04-08T12:42:50.768+03:00Скажите как понимать выражение uint8_t. На многих ...Скажите как понимать выражение uint8_t. На многих сайтах написано что это unsigned int но как int может быть 8 битным - не понятно?<br />И почему в описании к прогаммированию на ардуино нет информации по этому ввопросу?Anonymoushttps://www.blogger.com/profile/09930027790067107128noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-61077624799423448332010-10-15T17:51:29.715+04:002010-10-15T17:51:29.715+04:00Вы либо пользуйтесь своим "объектом для контр...Вы либо пользуйтесь своим "объектом для контроля сервы" myservo, либо analogWrite - видимо в этом причина. <br /><br />В комментах тяжело отлаживаться - предлагаю писать через профиль письма.idhttps://www.blogger.com/profile/11932466603117832284noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-39475810865624943362010-10-15T17:48:26.089+04:002010-10-15T17:48:26.089+04:00Попробовал этот скетч в механике-серва не реагируе...Попробовал этот скетч в механике-серва не реагирует.Где моя ошибка?<br />#include <br />#include <br />Servo myservo; // создаём объект для контроля сервы <br /><br /><br />int servoPin = 10; // порт подключения сервы<br />int pos = 0; // переменная для хранения позиции сервы <br /><br /><br />int inPin = 2; // контакт, к которому подключена кнопка<br />int outPin = 9; // контакт, к которому подключен светодиод<br />AF_Stepper motor(200, 2);//Создаем объект для двигателя на 2 канале (M3 и M4)<br /><br />int state = HIGH; // the current state of the output pin<br />int reading; // the current reading from the input pin<br />int previous = LOW; // the previous reading from the input pin<br /><br />long time = 0; // the last time the output pin was toggled<br />long debounce = 200; // the debounce time, increase if the output flickers<br /><br />void setup()<br />{<br />pinMode(inPin, INPUT);<br />pinMode(outPin, OUTPUT);<br />motor.setSpeed(100); // 100 оборотов в минуту<br />myservo.attach(10); // серва подключена к 10-му пину<br /><br />}<br /><br />void loop()<br />{<br />reading = digitalRead(inPin);<br /><br /><br />if (reading == HIGH && previous == LOW && millis() - time > debounce) {<br />motor.step(860, (state == HIGH) ? FORWARD:BACKWARD, SINGLE);<br />analogWrite(servoPin, (state == HIGH) ? 255:0);<br /><br />if (state == HIGH)<br />state = LOW;<br />else<br />state = HIGH; <br />time = millis();<br />}<br />digitalWrite(outPin, state);<br />previous = reading;<br />}Алексндрhttps://www.blogger.com/profile/08245863728234302694noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-21745532124688175882010-10-15T17:09:47.656+04:002010-10-15T17:09:47.656+04:00У обычной сервы скорость перемещения регулировать ...У обычной сервы <i>скорость</i> перемещения регулировать <b>нельзя</b>. Можно только позиционировать. <br /><br />Чтобы отвести ее на угол 180 градусов - в данном случае максимальный - надо сказать <b>analogWrite(servoPin,255);</b>, чтобы обратно - <b>analogWrite(servoPin,0);</b>.<br /><br />Я бы написал так: <b>analogWrite(servoPin, (state == HIGH) ? 255:0);</b>.idhttps://www.blogger.com/profile/11932466603117832284noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-67189950405041213432010-10-15T17:08:57.311+04:002010-10-15T17:08:57.311+04:00Допустим, поврот на 180 градусов за 10 секунд.И вр...Допустим, поврот на 180 градусов за 10 секунд.И время можно изменить.Алексндрhttps://www.blogger.com/profile/08245863728234302694noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-77162393022490815792010-10-15T17:04:30.314+04:002010-10-15T17:04:30.314+04:00Серва обычная.Это я не точно выразился.Имелось вви...Серва обычная.Это я не точно выразился.Имелось ввиду регулировать скорость перемещения в скетче.Алексндрhttps://www.blogger.com/profile/08245863728234302694noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-52247964201519074162010-10-15T16:52:06.692+04:002010-10-15T16:52:06.692+04:00А что за серва такая хитрая - с регулируемой скоро...А что за серва такая хитрая - с <i>регулируемой</i> скоростью перемещения?idhttps://www.blogger.com/profile/11932466603117832284noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-14482890751518425422010-10-15T16:50:06.338+04:002010-10-15T16:50:06.338+04:00Илья,пытался "привязать серву"-запутался...Илья,пытался "привязать серву"-запутался окончательно.Как вставить серву с углом поворота 180 гр.и с регулируемой скоростью перемещения в нижеследующий скетч,чтобы выполнялось условие? 1действие-Кнопка нажата,ШД делает определенное кол-во шагов вперед и останавливается,серва поворачивается на 180 гр.и останавливается.<br />2действие-Кнопка нажата,серва отрабатывает поворот на 180 гр. назад и останавливается, ШД отрабатывает движение назад и останавливается.<br />Очень важна последовательность действий.<br />Буду благодарен.Александр.<br /><br /><br />#include <br />#include "Servo.h"<br />Servo myservo;<br /><br />int servoPin = 10; // порт подключения сервы<br /><br /><br />int inPin = 2; // контакт, к которому подключена кнопка<br />int outPin = 9; // контакт, к которому подключен светодиод<br />AF_Stepper motor(200, 2);//Создаем объект для двигателя на 2 канале (M3 и M4)<br /><br />int state = HIGH; // the current state of the output pin<br />int reading; // the current reading from the input pin<br />int previous = LOW; // the previous reading from the input pin<br /><br />// the follow variables are long's because the time, measured in miliseconds,<br />// will quickly become a bigger number than can be stored in an int.<br />long time = 0; // the last time the output pin was toggled<br />long debounce = 200; // the debounce time, increase if the output flickers<br /><br />void setup()<br />{<br />pinMode(inPin, INPUT);<br />pinMode(outPin, OUTPUT);<br />motor.setSpeed(100); // 100 оборотов в минуту<br /><br />}<br /><br />void loop()<br />{<br />reading = digitalRead(inPin);<br /><br />// if the input just went from LOW and HIGH and we've waited long enough<br />// to ignore any noise on the circuit, toggle the output pin and remember<br />// the time<br />if (reading == HIGH && previous == LOW && millis() - time > debounce) {<br />motor.step(860, (state == HIGH) ? FORWARD:BACKWARD, SINGLE);<br /><br /><br />if (state == HIGH)<br />state = LOW;<br />else<br />state = HIGH;<br />time = millis();<br />}<br />digitalWrite(outPin, state);<br />previous = reading;<br />}Алексндрhttps://www.blogger.com/profile/08245863728234302694noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-14224892092620066502010-10-14T01:42:54.907+04:002010-10-14T01:42:54.907+04:00Тут могу посоветовать использовать для управления ...Тут могу посоветовать использовать для управления сервой аппаратный ШИМ, об этом <a href="http://mk90.blogspot.com/2010/08/wiring-6.html" rel="nofollow">Урок 6</a>.<br /><br />Но можно, конечно, и как в Вашем скетче, только неясно, зачем нужна функция servoPulse - она нигде не вызывается и в строке "Servo myservo((state == HIGH) ? (myAngle=0; myAngle<=180; myAngle++):(myAngle=180; myAngle>=0; myAngle--));" явная ошибка синтаксиса. Я бы просто написал <b>analogWrite(servoPin,value)</b>. Только надо перевести угол в value, согласно спецификации сервы.idhttps://www.blogger.com/profile/11932466603117832284noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-34047963709265769492010-10-13T21:16:47.877+04:002010-10-13T21:16:47.877+04:00Илья,здравствуйте!Пршу меня простить за назойливос...Илья,здравствуйте!Пршу меня простить за назойливость,но без Вашей помощи не обойтись.Не могу разобраться,как добавить в скетч серву.Все время выдает ошибку,а знаний не хватает, чтобы исправить.Задача: отрабатывать поворот сервы на заданный угол паралельно с работой ШД.Т.е,при нажатии кнопки ШД делает определенное кол-во шагов,серва поворачивается на определенный угол.При повторном нажатии кнопки ШД и серва отрабатывают назад.Если не затруднит подскажите,пожалуйста,как добиться желаемого.Заранее благодарен,Александр.<br /><br />#include <br />#include "Servo.h"<br />Servo myservo;<br /><br />int servoPin = 10; // порт подключения сервы<br />int myAngle; // будет хранить угол поворота<br />int pulseWidth; // длительность импульса<br />void servoPulse(int servoPin, int myAngle) <br />{<br /> pulseWidth = (myAngle * 11) + 500; // конвертируем угол в микросекунды<br /> digitalWrite(servoPin, HIGH); // устанавливаем серве высокий уровень<br /> delayMicroseconds(pulseWidth); // ждём<br /> digitalWrite(servoPin, LOW); // устанавливаем низкий уровень<br /> delay(20); // <br />}<br />int inPin = 2; // контакт, к которому подключена кнопка<br />int outPin = 9; // контакт, к которому подключен светодиод<br />AF_Stepper motor(200, 2);//Создаем объект для двигателя на 2 канале (M3 и M4)<br /><br />int state = HIGH; // the current state of the output pin<br />int reading; // the current reading from the input pin<br />int previous = LOW; // the previous reading from the input pin<br /><br />// the follow variables are long's because the time, measured in miliseconds,<br />// will quickly become a bigger number than can be stored in an int.<br />long time = 0; // the last time the output pin was toggled<br />long debounce = 200; // the debounce time, increase if the output flickers<br /><br />void setup()<br />{<br />pinMode(inPin, INPUT);<br />pinMode(outPin, OUTPUT);<br />motor.setSpeed(100); // 100 оборотов в минуту<br />pinMode(servoPin, OUTPUT);// конфигурируем пин сервы, как выход<br />}<br /><br />void loop()<br />{<br />reading = digitalRead(inPin);<br /><br />// if the input just went from LOW and HIGH and we've waited long enough<br />// to ignore any noise on the circuit, toggle the output pin and remember<br />// the time<br />if (reading == HIGH && previous == LOW && millis() - time > debounce) {<br />motor.step(860, (state == HIGH) ? FORWARD:BACKWARD, SINGLE);<br />Servo myservo((state == HIGH) ? (myAngle=0; myAngle<=180; myAngle++):(myAngle=180; myAngle>=0; myAngle--));<br /><br />if (state == HIGH)<br />state = LOW;<br />else<br />state = HIGH;<br />time = millis();<br />}<br />digitalWrite(outPin, state);<br />previous = reading;<br />}Алексндрhttps://www.blogger.com/profile/08245863728234302694noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-28973439036656582762010-10-12T18:02:17.539+04:002010-10-12T18:02:17.539+04:00Илья,благодарю за помощь!Все заработало.С уважение...Илья,благодарю за помощь!Все заработало.С уважением,Александр.Алексндрhttps://www.blogger.com/profile/08245863728234302694noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-39789421140999720482010-10-12T11:59:33.754+04:002010-10-12T11:59:33.754+04:00Знаете, Александр - скетч написан в точности так, ...Знаете, Александр - скетч написан в точности так, как он себя и ведет (с ваших слов). Т.е. последовательность команд сначала крутит вперед, потом назад.<br /><br />Надо дописать таким образом, чтобы направление поворота зависело от переменной state, например - справьте команду первого поворота:<br /><br /><b>motor.step(600, (STATE == HIGH) ? FORWARD:BACKWARD, SINGLE);</b> <br /><br />... а второй motor.step уберите вообще.idhttps://www.blogger.com/profile/11932466603117832284noreply@blogger.comtag:blogger.com,1999:blog-8944086625767573647.post-49547386157104137982010-10-12T08:58:28.509+04:002010-10-12T08:58:28.509+04:00Илья,здравствуйте! На Ваших уроках http://mk90.blo...Илья,здравствуйте! На Ваших уроках http://mk90.blogspot.com/2010/06/wiring-4.html пытаюсь овладеть навыками програмирования.Если это уместно,подскажите пожалуйста, где у меня ошибка в скетче.Задача: нажатие кнопки-горит светодиод и ШД делает определенное кол-во оборотов и останавливается.При повторном нажатии кнопки-светодиод гаснет и ШД отрабатывает движение назад.<br />У меня получается при нажатии кнопки ШД отрабатывает вперед и назад сразу.Где ошибка? Заранее благодарен.Александр.<br /><br /><br />#include <br />int inPin = 2; // the number of the input pin<br />int outPin = 9; // the number of the output pin<br />AF_Stepper motor(200, 2);<br /><br />int state = HIGH; // the current state of the output pin<br />int reading; // the current reading from the input pin<br />int previous = LOW; // the previous reading from the input pin<br /><br />// the follow variables are long's because the time, measured in miliseconds,<br />// will quickly become a bigger number than can be stored in an int.<br />long time = 0; // the last time the output pin was toggled<br />long debounce = 200; // the debounce time, increase if the output flickers<br /><br />void setup()<br />{<br /> pinMode(inPin, INPUT);<br /> pinMode(outPin, OUTPUT);<br /> motor.setSpeed(100); // 100 оборотов в минуту<br />}<br /><br />void loop()<br />{<br /> reading = digitalRead(inPin);<br /><br /> // if the input just went from LOW and HIGH and we've waited long enough<br /> // to ignore any noise on the circuit, toggle the output pin and remember<br /> // the time<br /> if (reading == HIGH && previous == LOW && millis() - time > debounce) {<br /> motor.step(600, FORWARD, SINGLE); //3 оборота<br /> if (state == HIGH)<br /> state = LOW;<br /> else<br /> state = HIGH;<br /> motor.step(600, BACKWARD, SINGLE); //3 оборота<br /><br /> time = millis();<br /> }<br /><br /> digitalWrite(outPin, state);<br /><br /> previous = reading;<br />}Алексндрhttps://www.blogger.com/profile/08245863728234302694noreply@blogger.com