Напомнило это байку про Левшу. Приехал Левша в Лондон. Я писец крутой мастер. Я аглицкую блоху подковал. А ему тамошие мастера говорят. Может у тебя и руки золотые, глаз пристрелен, но голова темная. Ведь есть законы механики, Ньютона. Вот что ты сделал. Раньше блоха плясала, а сейчас из-за твоего художества еле дергается. Оставайся, грамоте выучишься, механику свою подтянешь и глядишь такие чудные механизмы выпускать будешь. Но Левше видно учеба не по нутру, вот пить это настоящее русское дело. Ну пробухался и на родину вернулся. Так как бухариков в Лондоне и без него хватало. А то что Лесков написал, так это правда она не всегда приятна, лучшее ее выдумкой приукрасить. Возвеличить умение русских мастеровых.
Здесь я не про русских. Англичане бухарят как не больше, так как богаче живут. Просто при Левше потребность в кузнецах , так как подковывать и перековывать лошать надо часто. Раз подковал, значить регулярно перековывать , то потеря копыта, а значит лошади. В Англии уже паровой век. А значит кузнецы нужны как специалисты по паровым машинам. Другой технологический уровень.
Но возвращаюсь к программе. Ну нельзя так программировать , это сильно отстало. Нужно через функции point(int x, int y); line(int x, int y);go(int x, int y);home(); Ну и так далее.
Дело не в питье нашем, а в отсутствии смысла. Левша мог, но зачем?, а у англичан смысл был - блоха чтоб бегала.
Кругозор у Левши был маленький. Ведь в России он мог прожить клепая подковы и все. В Англии это умение было не надо. Да и оруженик был никакой. Не нашел там работу. Опять же вернулся в Россию без нормальных знаний. А так мог бы мастером оружеником приехать или же мельницы научится делать.
Вот и я говорю вы замечательную вещь сделали, но код ваш бесполезен. Вот и смысла не видно. А так бы недопринтер сделали. В Serial G-код. На выходе печать.
// for (r=0; r < 7; r++)
for (int currentSymbolNumber = 0; currentSymbolNumber < 7; currentSymbolNumber++) {
int drawPath = tablB[tablC[currentSymbolNumber]];
for (uint8_t segmentNumber = 0; segmentNumber < 15; segmentNumber++) {
switch (segmentNumber) {
case 1:
A = 0; B = 1;
break;
case 2:
A = 16; B = 17;
break;
case 3:
A = 10; B = 11;
break;
case 4:
A = 2; B = 3;
break;
case 5:
A = 14; B = 15;
break;
case 6:
A = 8; B = 9;
break;
...
}
servo1.write(tablA[A]); servo2.write(tablA[B]); delay(n);
f_(bitRead(drawPath, segmentNumber)); fv_(); f_(0);
// f_(bitRead(drawPath, 15 - segmentNumber)); fv_(); f_(0);
}
///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч №5 буквы алфавита в две строки слов //////////////////////////////
#include <Servo.h> // подключение библиотеки Servo
Servo servo1;//указываем сервопривод основного поворота (при увел. угла - поворот рычага ВЛЕВО)
Servo servo2;//указываем сервопривод дополнительного поворота (при увел. угла - поворот рычага ВПРАВО)
Servo servo3;//указываем сервопривод подъёмника (при увел. угла - поворот рычага ВВЕРХ)
int a=110;//начальный угол
int b=112;
int a03=125;
int da=8;int db=25;//переменные задающие величину изменения углов
int K;
int A; int B; //переменные для текущих значений углов поворота сервоприводов
int a3=a03;
int i;//счётчик
int r=0;//счётчик числа рисуемых букв с нуля отсчёта в строке
int n=15;// единица временного интервала
int j;// переменная для выбранной буквы
int s=0;//переменная числа строк с номера 0 до 1 включительно
int tablC[14]={15,16,8,2,5,18,33, 0,16,4,19,8,13,14};//слова для письма - ПРИВЕТ АРДУИНО
unsigned short tablB[34]={0b0010010001001100, //0-А//
0b1011001111110000, //1-Б//
0b1001001110111001, //2-В//
0b1001000000110000, //3-Г//
0b0010011100001100, //4-Д//
0b1001001110110000, //5-Е//
0b0100100000001111, //6-Ж//
0b0010001101111000, //7-З//
0b1011010000001100, //8-И//
0b1011110000001100, //9-Й//
0b1001000010001001, //10-К//
0b0010010000001100, //11-Л//
0b1011010000001010, //12-М//
0b1011010011000000, //13-Н//
0b1011011100110000, //14-О//
0b1011010000110000, //15-П//
0b1001010011110000, //16-Р//
0b1001001100110000, //17-С//
0b0100100000110000, //18-Т//
0b0011011111000000, //19-У//
0b0101110011110000, //20-Ф//
0b0000000000001111, //21-Х//
0b1011011100000001, //22-Ц//
0b0011010011000000, //23-Ч//
0b1111111100000000, //24-Ш//
0b1111111100000001, //25-Щ//
0b0110100101100000, //26-Ъ//
0b1111011010000000, //27-Ы//
0b1011001111000000, //28-Ь//
0b0010011101110000, //29-Э//
0b1111110110010000, //30-Ю//
0b0011010011110100, //31-Я//
0b1111111111111111, //32// рисуем все 16 сегментов//
0b0000000000000000};//33-пробел // таблица кодов сегментов-букв
int tablD[32]={0,1,16,17,10,11,2,3,14,15,8,9,0,1,16,17,2,3,14,15,4,5,12,13,14,15,0,1,14,15,10,11};//номера элементов из массива координат узловых точек сегментов
void setup()
{
//Serial.begin(9600);
servo1.attach(5);// подключаем переменную servo к соответствующему выводу платы Ардуино
servo2.attach(6);
servo3.attach(7);
servo1.write(a);//начальная установка положения
servo2.write(b);
servo3.write(a03);
delay(1000);
}
//////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
if (s<2)//условие рисования 2 строк букв
{
f_(0);
for (r=0;r<7;r++)// условие числа рисуемых букв
{
int tablA[18]={a, b,
a+db/4, b+db/2,
a+db/2, b+db,
a+db/2-da, b+db,
a+db/4-da, b+db/2,
a-da, b,
a+db/2-da/2,b+db,
a+db/4-da/2,b+db/2,
a-da/2, b }; // координаты узловых точек сегментов
j=tablC[r+7*s];
///////////////////////////////////////////////////////////////////////
for( K=0;K<=31;K=K+2)
{A=tablA[tablD[K]];B=tablA[tablD[K+1]];
if(bitRead(tablB[j],15-K/2)==1)
{servo1.write(A);servo2.write(B);delay(n);
f_(1);
if(K>=0&&K<11){fv_();}
if(K>=12&&K<23){fg_();}
if(K>=24&&K<27){fdp_();}
if(K>=28&&K<31){fdl_();}
f_(0);}}
//////////////////////////////////////////////////////////////////////
a=a-da-2;
}
s++;a=98;b=85;
}
}
//////функция поднимания-опускания фломастера (значения аргумента 0 и 1 соответственно)/////
void f_(int k)
{
while (a3>85&&k==1)
{servo3.write(a3);a3=a3-1;delay(n);}if(k==1){a3=85;}
while (a3<125&&k==0)
{servo3.write(a3);a3=a3+1;delay(n);}if (k==0){a3=125;}
}
//////функция рисования отрезка вертикально вверх /////
void fv_()
{
int K1=0;
while (K1<=db/2)
{servo1.write(A);servo2.write(B);B=B+2;A=A+1;K1=K1+2;delay(n);}
}
//////функция рисования отрезка горизонтально вправо /////
void fg_()
{
int K1=0;
while (K1<=da/2)
{servo1.write(A);A=A-1;K1=K1+1;delay(n/2);}
}
//////функция рисования отрезка по диагонали вправо-вверх /////
void fdp_()
{
int K1=0;
while (K1<db/4)
{K1=K1+1;B=B+1;servo2.write(B);delay(n);}
servo1.write(A+db/4-da/2);delay(n);
K1=0;
while (K1<db/4)
{K1=K1+1;B=B+1;servo2.write(B);delay(n);}
}
//////функция рисования отрезка по диагонали влево-вверх /////
void fdl_()
{
int K1=0;
while (K1<3*db/16)
{K1=K1+2;B=B+3;A=A+2;servo2.write(B);servo1.write(A);delay(n);}
servo2.write(B);servo1.write(A);delay(n);
K1=0;
while (K1<3*db/16)
{K1=K1+1;B=B+1;A=A+1;servo2.write(B);servo1.write(A);delay(n);}
}
Пришлось ввести ещё один массив, вариант "не аховый", но иного с утра не приходило в голову. Теперь пишем две строки "ПРИВЕТ АРДУИНО". На другом форуме подсказали (если делать всё же "недопринтер"), что надо писать и передавать на манипулятор не номера букв в tablC[]; ,а char tablC[]="АРДУИНО" и вычитая 192 из кода символа получать номера для j. Попробовал не прошёл фокус почему то.
char tablC[]="АРДУИНО";
int j;
int r=0;
void setup() {
Serial.begin(9600);
}
void loop() {
while (r<7){
j=tablC[r]; Serial.println(j);r++;delay(1000);}
}
Числа вылезают совсем не ожидаемые 192,193 и т.д. Пробовал "ARDUINO" - тут всё правильно 65 ... Почему так?
Читанул, ещё нашёл такой же наивный вопрос двухлетней давности. Слово даже такое :) - ПРИВЕТ.
Почему числа отрицательные и парные? Ну с парными, наверно ясно - два числа задают код символа.
Для решения поставленной задачки, тоже не принципиально - ещё одна таблица-массив в скетче для соответствия 'A' и 0, лишь бы эти числа не с потолка были.
///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч №5 буквы алфавита ////////////////////////////// #include <Servo.h> // подключение библиотеки Servo Servo servo1;//указываем сервопривод основного поворота (при увел. угла - поворот рычага ВЛЕВО) Servo servo2;//указываем сервопривод дополнительного поворота (при увел. угла - поворот рычага ВПРАВО) Servo servo3;//указываем сервопривод подъёмника (при увел. угла - поворот рычага ВВЕРХ) int a=98;//начальный угол int b=85; int a03=125; int da=8;int db=25;//переменные задающие величину изменения углов int A; int B; //переменные для текущих значений углов поворота сервоприводов int a3=a03; int i;//счётчик int r=0;//счётчик числа рисуемых букв с нуля отсчёта int n=15;// единица временного интервала int j;// переменная для выбранной буквы int tablC[7]={0,16,4,19,8,13,14}; int tablB[544]={0,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0, //0-А// 1,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0, //1-Б// 1,0,0,1,0,0,1,1,0,0,1,1,1,0,0,1, //2-В// 1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0, //3-Г// 0,0,1,0,0,1,1,1,0,0,0,0,1,1,0,0, //4-Д// 1,0,0,1,0,0,1,1,1,0,1,1,0,0,0,0, //5-Е// 0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1, //6-Ж// 0,0,1,0,0,0,1,1,0,1,1,1,1,0,0,0, //7-З// 1,0,1,1,0,1,0,0,0,0,0,0,1,1,0,0, //8-И// 1,0,1,1,1,1,0,0,0,0,0,0,1,1,0,0, //9-Й// 1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1, //10-К// 0,0,1,0,0,1,0,0,0,0,0,0,1,1,0,0, //11-Л// 1,0,1,1,0,1,0,0,0,0,0,0,1,0,1,0, //12-М// 1,0,1,1,0,1,0,0,1,1,0,0,0,0,0,0, //13-Н// 1,0,1,1,0,1,1,1,0,0,1,1,0,0,0,0, //14-О// 1,0,1,1,0,1,0,0,0,0,1,1,0,0,0,0, //15-П// 1,0,0,1,0,1,0,0,1,1,1,1,0,0,0,0, //16-Р// 1,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0, //17-С// 0,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0, //18-Т// 0,0,1,1,0,1,1,1,1,1,0,0,0,0,0,0, //19-У// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //32// рисуем все 16 сегментов// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//33-пробел // таблица кодов сегментов-букв void setup() { //Serial.begin(9600); servo1.attach(5);// подключаем переменную servo к соответствующему выводу платы Ардуино servo2.attach(6); servo3.attach(7); servo1.write(a);//начальная установка положения servo2.write(b); servo3.write(a03); delay(1000); } ////////////////////////////////////////////////////////////////////////////////////////////// void loop() { if (r<7) { f_(0); for (r=0;r<7;r++)// условие числа рисуемых букв { int tablA[18]={a, b, a+db/4, b+db/2, a+db/2, b+db, a+db/2-da, b+db, a+db/4-da, b+db/2, a-da, b, a+db/2-da/2,b+db, a+db/4-da/2,b+db/2, a-da/2, b }; // координаты узловых точек сегментов j=tablC[r]; //////////////////////////////// 1 //////////////////////////////// A=tablA[0];B=tablA[1]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+0]);fv_();f_(0); //////////////////////////////// 2 //////////////////////////////// A=tablA[16];B=tablA[17]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+1]);fv_();f_(0); //////////////////////////////// 3 //////////////////////////////// A=tablA[10];B=tablA[11]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+2]);fv_();f_(0); //////////////////////////////// 4 //////////////////////////////// A=tablA[2];B=tablA[3]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+3]);fv_();f_(0); //////////////////////////////// 5 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+4]);fv_();f_(0); //////////////////////////////// 6 //////////////////////////////// A=tablA[8];B=tablA[9]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+5]);fv_();f_(0); //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 7 //////////////////////////////// A=tablA[0];B=tablA[1]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+6]);fg_();f_(0); //////////////////////////////// 8 //////////////////////////////// A=tablA[16];B=tablA[17]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+7]);fg_();f_(0); //////////////////////////////// 9 //////////////////////////////// A=tablA[2];B=tablA[3]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+8]);fg_();f_(0); //////////////////////////////// 10 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+9]);fg_();f_(0); //////////////////////////////// 11 //////////////////////////////// A=tablA[4];B=tablA[5]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+10]);fg_();f_(0); //////////////////////////////// 12 //////////////////////////////// A=tablA[12];B=tablA[13]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+11]);fg_();f_(0); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 13 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+12]);fdp_();f_(0); //////////////////////////////// 14 //////////////////////////////// A=tablA[0];B=tablA[1]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+13]);fdp_();f_(0); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 15 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+14]);fdl_();f_(0); //////////////////////////////// 16 //////////////////////////////// A=tablA[10];B=tablA[11]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+15]);fdl_();f_(0); //////////////////////////////////////////////////////////////////////// a=a-da-2; } } } //////функция поднимания-опускания фломастера (значения аргумента 0 и 1 соответственно)///// void f_(int k) { while (a3>85&&k==1) {servo3.write(a3);a3=a3-1;delay(n);}if(k==1){a3=85;} while (a3<125&&k==0) {servo3.write(a3);a3=a3+1;delay(n);}if (k==0){a3=125;} } //////функция рисования отрезка вертикально вверх ///// void fv_() { int K1=0; while (K1<=db/2) {servo1.write(A);servo2.write(B);B=B+2;A=A+1;K1=K1+2;delay(n);} } //////функция рисования отрезка горизонтально вправо ///// void fg_() { int K1=0; while (K1<=da/2) {servo1.write(A);A=A-1;K1=K1+1;delay(n/2);} } //////функция рисования отрезка по диагонали вправо-вверх ///// void fdp_() { int K1=0; while (K1<db/4) {K1=K1+1;B=B+1;servo2.write(B);delay(n);} servo1.write(A+db/4-da/2);delay(n); K1=0; while (K1<db/4) {K1=K1+1;B=B+1;servo2.write(B);delay(n);} } //////функция рисования отрезка по диагонали влево-вверх ///// void fdl_() { int K1=0; while (K1<3*db/16) {K1=K1+2;B=B+3;A=A+2;servo2.write(B);servo1.write(A);delay(n);} servo2.write(B);servo1.write(A);delay(n); K1=0; while (K1<3*db/16) {K1=K1+1;B=B+1;A=A+1;servo2.write(B);servo1.write(A);delay(n);} }Напомнило это байку про Левшу. Приехал Левша в Лондон. Я писец крутой мастер. Я аглицкую блоху подковал. А ему тамошие мастера говорят. Может у тебя и руки золотые, глаз пристрелен, но голова темная. Ведь есть законы механики, Ньютона. Вот что ты сделал. Раньше блоха плясала, а сейчас из-за твоего художества еле дергается. Оставайся, грамоте выучишься, механику свою подтянешь и глядишь такие чудные механизмы выпускать будешь. Но Левше видно учеба не по нутру, вот пить это настоящее русское дело. Ну пробухался и на родину вернулся. Так как бухариков в Лондоне и без него хватало. А то что Лесков написал, так это правда она не всегда приятна, лучшее ее выдумкой приукрасить. Возвеличить умение русских мастеровых.
Это правда о русских в чистом виде...
Но, тут не понятна такая загвоздка - почему смена значения элемента массива требует его присутствия внутри loop(); (сталкивался с таким и ранее).
Понимаю, что "таблица В" тяжёлая, нужно переходить на биты. Но как вытащить бит из числа и сравнить его с "0" или "1"?
Почитай за bitRead()
Но возвращаюсь к программе. Ну нельзя так программировать , это сильно отстало. Нужно через функции point(int x, int y); line(int x, int y);go(int x, int y);home(); Ну и так далее.
Ясно, пока попробую за bitRead();
Англичане бухарят как не больше, так как богаче живут.
Подтверждаю: колдырят по-чёрному, реально. Бич среди молодёжи, по пятницам - вообще мрак, чего творится у баров.
Попробовал так, рисует одни вертикальные чёрточки. Явно что то не так со считыванием данных. Номер бита в числе возрастает справо налево?.. и идёт от 0 до 15? ///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч №5 буквы алфавита ////////////////////////////// #include <Servo.h> // подключение библиотеки Servo Servo servo1;//указываем сервопривод основного поворота (при увел. угла - поворот рычага ВЛЕВО) Servo servo2;//указываем сервопривод дополнительного поворота (при увел. угла - поворот рычага ВПРАВО) Servo servo3;//указываем сервопривод подъёмника (при увел. угла - поворот рычага ВВЕРХ) int a=98;//начальный угол int b=85; int a03=125; int da=8;int db=25;//переменные задающие величину изменения углов int A; int B; //переменные для текущих значений углов поворота сервоприводов int a3=a03; int i;//счётчик int r=0;//счётчик числа рисуемых букв с нуля отсчёта int n=15;// единица временного интервала int j;// переменная для выбранной буквы int tablC[7]={0,16,4,19,8,13,14};//слово для письма - АРДУИНО unsigned short tablB[34]={0b0010010001001100, //0-А// 0b1011001111110000, //1-Б// 0b1001001100111001, //2-В// 0b1001000000110000, //3-Г// 0b0010011100001100, //4-Д// 0b1001001110110000, //5-Е// 0b0100100000001111, //6-Ж// 0b0010001101111000, //7-З// 0b1011010000001100, //8-И// 0b1011110000001100, //9-Й// 0b1001000010001001, //10-К// 0b0010010000001100, //11-Л// 0b1011010000001010, //12-М// 0b1011010011000000, //13-Н// 0b1011011100110000, //14-О// 0b1011010000110000, //15-П// 0b1001010011110000, //16-Р// 0b1001001100110000, //17-С// 0b0100100000110000, //18-Т// 0b0011011111000000, //19-У// 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b1111111111111111, //32// рисуем все 16 сегментов// 0b0000000000000000};//33-пробел // таблица кодов сегментов-букв void setup() { //Serial.begin(9600); servo1.attach(5);// подключаем переменную servo к соответствующему выводу платы Ардуино servo2.attach(6); servo3.attach(7); servo1.write(a);//начальная установка положения servo2.write(b); servo3.write(a03); delay(1000); } ////////////////////////////////////////////////////////////////////////////////////////////// void loop() { if (r<7) { f_(0); for (r=0;r<7;r++)// условие числа рисуемых букв { int tablA[18]={a, b, a+db/4, b+db/2, a+db/2, b+db, a+db/2-da, b+db, a+db/4-da, b+db/2, a-da, b, a+db/2-da/2,b+db, a+db/4-da/2,b+db/2, a-da/2, b }; // координаты узловых точек сегментов j=tablC[r]; //////////////////////////////// 1 //////////////////////////////// A=tablA[0];B=tablA[1]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],15));fv_();f_(0); //////////////////////////////// 2 //////////////////////////////// A=tablA[16];B=tablA[17]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],14));fv_();f_(0); //f_(tablB[16*j+1]);fv_();f_(0); //////////////////////////////// 3 //////////////////////////////// A=tablA[10];B=tablA[11]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],13));fv_();f_(0); //f_(tablB[16*j+2]);fv_();f_(0); //////////////////////////////// 4 //////////////////////////////// A=tablA[2];B=tablA[3]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],12));fv_();f_(0); //f_(tablB[16*j+3]);fv_();f_(0); //////////////////////////////// 5 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],11));fv_();f_(0); //f_(tablB[16*j+4]);fv_();f_(0); //////////////////////////////// 6 //////////////////////////////// A=tablA[8];B=tablA[9]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],10));fv_();f_(0); //f_(tablB[16*j+5]);fv_();f_(0); //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 7 //////////////////////////////// A=tablA[0];B=tablA[1]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],9));fv_();f_(0); //f_(tablB[16*j+6]);fg_();f_(0); //////////////////////////////// 8 //////////////////////////////// A=tablA[16];B=tablA[17]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],8));fv_();f_(0); //f_(tablB[16*j+7]);fg_();f_(0); //////////////////////////////// 9 //////////////////////////////// A=tablA[2];B=tablA[3]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],7));fv_();f_(0); //f_(tablB[16*j+8]);fg_();f_(0); //////////////////////////////// 10 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],6));fv_();f_(0); //f_(tablB[16*j+9]);fg_();f_(0); //////////////////////////////// 11 //////////////////////////////// A=tablA[4];B=tablA[5]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],5));fv_();f_(0); //f_(tablB[16*j+10]);fg_();f_(0); //////////////////////////////// 12 //////////////////////////////// A=tablA[12];B=tablA[13]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],4));fv_();f_(0); //f_(tablB[16*j+11]);fg_();f_(0); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 13 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],3));fv_();f_(0); //f_(tablB[16*j+12]);fdp_();f_(0); //////////////////////////////// 14 //////////////////////////////// A=tablA[0];B=tablA[1]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],2));fv_();f_(0); //f_(tablB[16*j+13]);fdp_();f_(0); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 15 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],1));fv_();f_(0); //f_(tablB[16*j+14]);fdl_();f_(0); //////////////////////////////// 16 //////////////////////////////// A=tablA[10];B=tablA[11]; servo1.write(A);servo2.write(B);delay(n); f_(bitRead(tablB[j],0));fv_();f_(0); //f_(tablB[16*j+15]);fdl_();f_(0); //////////////////////////////////////////////////////////////////////// a=a-da-2; } } } //////функция поднимания-опускания фломастера (значения аргумента 0 и 1 соответственно)///// void f_(int k) { while (a3>85&&k==1) {servo3.write(a3);a3=a3-1;delay(n);}if(k==1){a3=85;} while (a3<125&&k==0) {servo3.write(a3);a3=a3+1;delay(n);}if (k==0){a3=125;} } //////функция рисования отрезка вертикально вверх ///// void fv_() { int K1=0; while (K1<=db/2) {servo1.write(A);servo2.write(B);B=B+2;A=A+1;K1=K1+2;delay(n);} } //////функция рисования отрезка горизонтально вправо ///// void fg_() { int K1=0; while (K1<=da/2) {servo1.write(A);A=A-1;K1=K1+1;delay(n/2);} } //////функция рисования отрезка по диагонали вправо-вверх ///// void fdp_() { int K1=0; while (K1<db/4) {K1=K1+1;B=B+1;servo2.write(B);delay(n);} servo1.write(A+db/4-da/2);delay(n); K1=0; while (K1<db/4) {K1=K1+1;B=B+1;servo2.write(B);delay(n);} } //////функция рисования отрезка по диагонали влево-вверх ///// void fdl_() { int K1=0; while (K1<3*db/16) {K1=K1+2;B=B+3;A=A+2;servo2.write(B);servo1.write(A);delay(n);} servo2.write(B);servo1.write(A);delay(n); K1=0; while (K1<3*db/16) {K1=K1+1;B=B+1;A=A+1;servo2.write(B);servo1.write(A);delay(n);} }Нет, пардон это я дятел со своим тупым копированием верхних строк...
Исправил свои fv_ на fg_....заработало.
Дело не в питье нашем, а в отсутствии смысла. Левша мог, но зачем?, а у англичан смысл был - блоха чтоб бегала.
Почитай за bitRead()
Спасибо доктор, помогло.
Вот и я говорю вы замечательную вещь сделали, но код ваш бесполезен. Вот и смысла не видно. А так бы недопринтер сделали. В Serial G-код. На выходе печать.
Мне тоже механика понравилась. В код не пытался вникнуть - какие-то одинаковые фрагменты по нему раскиданы, переменные неудачно названы и пр...
Насчёт непопринтера...идея была сделать недопишущую машинку :) Управлять рисованием букв через потенциометр и кнопку, а не компьютер.
Код можно упростить, но надо думать.
Код можно упростить, но надо думать.
Вот вам фрагмент для начала думанья:
// for (r=0; r < 7; r++) for (int currentSymbolNumber = 0; currentSymbolNumber < 7; currentSymbolNumber++) { int drawPath = tablB[tablC[currentSymbolNumber]]; for (uint8_t segmentNumber = 0; segmentNumber < 15; segmentNumber++) { switch (segmentNumber) { case 1: A = 0; B = 1; break; case 2: A = 16; B = 17; break; case 3: A = 10; B = 11; break; case 4: A = 2; B = 3; break; case 5: A = 14; B = 15; break; case 6: A = 8; B = 9; break; ... } servo1.write(tablA[A]); servo2.write(tablA[B]); delay(n); f_(bitRead(drawPath, segmentNumber)); fv_(); f_(0); // f_(bitRead(drawPath, 15 - segmentNumber)); fv_(); f_(0); }///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч №5 буквы алфавита в две строки слов ////////////////////////////// #include <Servo.h> // подключение библиотеки Servo Servo servo1;//указываем сервопривод основного поворота (при увел. угла - поворот рычага ВЛЕВО) Servo servo2;//указываем сервопривод дополнительного поворота (при увел. угла - поворот рычага ВПРАВО) Servo servo3;//указываем сервопривод подъёмника (при увел. угла - поворот рычага ВВЕРХ) int a=110;//начальный угол int b=112; int a03=125; int da=8;int db=25;//переменные задающие величину изменения углов int K; int A; int B; //переменные для текущих значений углов поворота сервоприводов int a3=a03; int i;//счётчик int r=0;//счётчик числа рисуемых букв с нуля отсчёта в строке int n=15;// единица временного интервала int j;// переменная для выбранной буквы int s=0;//переменная числа строк с номера 0 до 1 включительно int tablC[14]={15,16,8,2,5,18,33, 0,16,4,19,8,13,14};//слова для письма - ПРИВЕТ АРДУИНО unsigned short tablB[34]={0b0010010001001100, //0-А// 0b1011001111110000, //1-Б// 0b1001001110111001, //2-В// 0b1001000000110000, //3-Г// 0b0010011100001100, //4-Д// 0b1001001110110000, //5-Е// 0b0100100000001111, //6-Ж// 0b0010001101111000, //7-З// 0b1011010000001100, //8-И// 0b1011110000001100, //9-Й// 0b1001000010001001, //10-К// 0b0010010000001100, //11-Л// 0b1011010000001010, //12-М// 0b1011010011000000, //13-Н// 0b1011011100110000, //14-О// 0b1011010000110000, //15-П// 0b1001010011110000, //16-Р// 0b1001001100110000, //17-С// 0b0100100000110000, //18-Т// 0b0011011111000000, //19-У// 0b0101110011110000, //20-Ф// 0b0000000000001111, //21-Х// 0b1011011100000001, //22-Ц// 0b0011010011000000, //23-Ч// 0b1111111100000000, //24-Ш// 0b1111111100000001, //25-Щ// 0b0110100101100000, //26-Ъ// 0b1111011010000000, //27-Ы// 0b1011001111000000, //28-Ь// 0b0010011101110000, //29-Э// 0b1111110110010000, //30-Ю// 0b0011010011110100, //31-Я// 0b1111111111111111, //32// рисуем все 16 сегментов// 0b0000000000000000};//33-пробел // таблица кодов сегментов-букв int tablD[32]={0,1,16,17,10,11,2,3,14,15,8,9,0,1,16,17,2,3,14,15,4,5,12,13,14,15,0,1,14,15,10,11};//номера элементов из массива координат узловых точек сегментов void setup() { //Serial.begin(9600); servo1.attach(5);// подключаем переменную servo к соответствующему выводу платы Ардуино servo2.attach(6); servo3.attach(7); servo1.write(a);//начальная установка положения servo2.write(b); servo3.write(a03); delay(1000); } ////////////////////////////////////////////////////////////////////////////////////////////// void loop() { if (s<2)//условие рисования 2 строк букв { f_(0); for (r=0;r<7;r++)// условие числа рисуемых букв { int tablA[18]={a, b, a+db/4, b+db/2, a+db/2, b+db, a+db/2-da, b+db, a+db/4-da, b+db/2, a-da, b, a+db/2-da/2,b+db, a+db/4-da/2,b+db/2, a-da/2, b }; // координаты узловых точек сегментов j=tablC[r+7*s]; /////////////////////////////////////////////////////////////////////// for( K=0;K<=31;K=K+2) {A=tablA[tablD[K]];B=tablA[tablD[K+1]]; if(bitRead(tablB[j],15-K/2)==1) {servo1.write(A);servo2.write(B);delay(n); f_(1); if(K>=0&&K<11){fv_();} if(K>=12&&K<23){fg_();} if(K>=24&&K<27){fdp_();} if(K>=28&&K<31){fdl_();} f_(0);}} ////////////////////////////////////////////////////////////////////// a=a-da-2; } s++;a=98;b=85; } } //////функция поднимания-опускания фломастера (значения аргумента 0 и 1 соответственно)///// void f_(int k) { while (a3>85&&k==1) {servo3.write(a3);a3=a3-1;delay(n);}if(k==1){a3=85;} while (a3<125&&k==0) {servo3.write(a3);a3=a3+1;delay(n);}if (k==0){a3=125;} } //////функция рисования отрезка вертикально вверх ///// void fv_() { int K1=0; while (K1<=db/2) {servo1.write(A);servo2.write(B);B=B+2;A=A+1;K1=K1+2;delay(n);} } //////функция рисования отрезка горизонтально вправо ///// void fg_() { int K1=0; while (K1<=da/2) {servo1.write(A);A=A-1;K1=K1+1;delay(n/2);} } //////функция рисования отрезка по диагонали вправо-вверх ///// void fdp_() { int K1=0; while (K1<db/4) {K1=K1+1;B=B+1;servo2.write(B);delay(n);} servo1.write(A+db/4-da/2);delay(n); K1=0; while (K1<db/4) {K1=K1+1;B=B+1;servo2.write(B);delay(n);} } //////функция рисования отрезка по диагонали влево-вверх ///// void fdl_() { int K1=0; while (K1<3*db/16) {K1=K1+2;B=B+3;A=A+2;servo2.write(B);servo1.write(A);delay(n);} servo2.write(B);servo1.write(A);delay(n); K1=0; while (K1<3*db/16) {K1=K1+1;B=B+1;A=A+1;servo2.write(B);servo1.write(A);delay(n);} }Пришлось ввести ещё один массив, вариант "не аховый", но иного с утра не приходило в голову. Теперь пишем две строки "ПРИВЕТ АРДУИНО". На другом форуме подсказали (если делать всё же "недопринтер"), что надо писать и передавать на манипулятор не номера букв в tablC[]; ,а char tablC[]="АРДУИНО" и вычитая 192 из кода символа получать номера для j. Попробовал не прошёл фокус почему то.
char tablC[]="АРДУИНО"; int j; int r=0; void setup() { Serial.begin(9600); } void loop() { while (r<7){ j=tablC[r]; Serial.println(j);r++;delay(1000);} }Числа вылезают совсем не ожидаемые 192,193 и т.д. Пробовал "ARDUINO" - тут всё правильно 65 ... Почему так?
leks, а в какой кодировке Вы пишете "АРДУИНО"?
leks, а в какой кодировке Вы пишете "АРДУИНО"?
А куда мне пойти почитать?:)
Не знаю, просто в скетче набираю русские АРДУИНО в содержимое таблицы и смотрю в монитор, потом англицкие ARDUINO и опять в монитор.
Что то надо где то менять?
Начинать можно отсюда: https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D1%8B
http://arduino.ru/forum/programmirovanie/kodirovka-kompilyatora
Читанул, ещё нашёл такой же наивный вопрос двухлетней давности. Слово даже такое :) - ПРИВЕТ.
Почему числа отрицательные и парные? Ну с парными, наверно ясно - два числа задают код символа.
Для решения поставленной задачки, тоже не принципиально - ещё одна таблица-массив в скетче для соответствия 'A' и 0, лишь бы эти числа не с потолка были.
Читанул ещё раз, сделал так:
char tablC[]="АРДУИНО"; byte j; int r=0; void setup() { Serial.begin(9600); } void loop() { while (r<14){ j=tablC[r]; Serial.println(j);r++;delay(1000);} }Теперь пошли ожидаемые на 'A' 208 144... Можно дальше думать.
Всё!, разобрался. Если в самом скетче прописывать 'A' код один, если через serial передавать, другой, боже как всё понятно и легко :)
Сохраните скетч в WIN1251 - будет третий... CP866 - четвертый, KOI-8R - ...
Да клепатня с этими буквами в программировании. Все везде пишут F1= и всё, никто не пишет forceinitial=