roboforum.ru

Технический форум по робототехнике.

Вопросы новичка.

Re: Вопросы новичка.

dimamichev » 27 июл 2018, 20:20

Номер такой - 00:18:E5:03:62:AA

Добавлено спустя 1 час 3 минуты 16 секунд:
Нет, туго с пониманием логики конструктора. Молчит как партизан.

Добавлено спустя 1 час 59 минут 4 секунды:
Заработало только с кнопкою дополнительной.
Вложения
5.jpg
4.jpg

Re: Вопросы новичка.

Scorpio » 27 июл 2018, 22:45

Делаешь успехи! Посмотри операторы раблты с текстом. Там есть объединение нескольких фраз в один текст. После получения распознаной фразы, добавляешь "Ты сказал " и отправляешь сразу в синтезатор.

Re: Вопросы новичка.

dimamichev » 27 июл 2018, 23:02

Посмотрел присланный файл ещё раз. Наконец то увидел куда номер модуля ставить, две функции которые не надо трогать, красную кнопку которую надо оставить. Остальные кнопки можно убирать. Добавлять вместо них условия "если распознанный текст-результат равен такому то "тексту"", шли, например, букву "D"...А давать команду на распознание долгим нажатием на ту же красно-жёлто-зелёную кнопку.
Такой вопрос - модуль можно просто подключить к 0 и 1 и считывать всё как из монитор порта, на скорости 9600?,организовывая функции обработки как в предыдущем случае с шашками.

Re: Вопросы новичка.

Dmitry__ » 28 июл 2018, 00:53

Scorpio писал(а):Делаешь успехи!

dimamichev писал(а):Такой вопрос - модуль можно просто подключить к 0 и 1 и считывать всё как из монитор порта, на скорости 9600?,организовывая функции обработки

Не отец, но мужчина :crazy:

Re: Вопросы новичка.

Scorpio » 28 июл 2018, 03:38

Dmitry__ писал(а):Не отец, но мужчина :crazy:

Та нармальна всёёёё! :beer:
dimamichev писал(а): и считывать всё как из монитор порта, на скорости 9600?,организовывая функции обработки как в предыдущем случае с шашками.

ВТ модуль конечно подключается к СОМ порту (ты вроде уже подключал) и передавать все что хочешь, точно как в терминале IDE Arduino. Не забывай добавлять в конце строки "\n" (новая строка), чтобы дуня съела строку целиком.
NewLine.jpg

Re: Вопросы новичка.

dimamichev » 28 июл 2018, 07:54

На стороне Ардуины такой код планирую. В нём пока три рисунка "в функциях" по "командам извне". Из "рисовальных" функций постановка точки в полярных и декартовых координатах, рисование отрезка-вектора (через полярные координаты), окружности,квадрата,треугольника равностороннего.
По ресурсам, думаю, ещё много влезет картинок(33 процента памяти задействовано).
Код: Выделить всёРазвернуть
///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч РИСОВАНИЕ //////////////////////////////
#include <Servo.h>
////////////////////////////////////////////////////////////////
#define l1 65  //длина первого плеча манипулятора в мм.
#define l2 65  //длина второго плеча манипулятора в мм.

#define Lmax 120//значение граничных координат
#define Qmax 140//значение граничных координат
#define Acor1 352//поправка на посадку качалки сервы 1
#define Acor2 220//поправка на посадку качалки сервы 2
#define Lmin 50//значение граничных координат
#define Dstep 1 //шаг при рисовании отрезка
#define Dmax 50//максимальной длины отрезок
//Для аварийной остановки в процессе рисования - не задействована
boolean StopFlag=false;
////////////////////////////////////////////////////////////////
float CurL=1000;
float CurQ=1000;
byte a03=125;
byte a3=a03;
int n=10;//переменная единицы временного интервала
String inputString;// строка данных
///////////////////////////////////////////////////////////////
Servo servo1;
Servo servo2;
Servo servo3;


void setup() {
Serial.begin(9600);
servo1.attach(5);
servo2.attach(6);
servo3.attach(7);
servo1.write(100);
servo2.write(110);
servo3.write(a03);
}

void loop()
    {
       CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ НА РИСОВАНИЕ ЗАДАННОГО ОБЪЕКТА
    }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////ФУНКЦИИ ФУНУЦИИ ФУНКЦИИ ФУНУЦИИ ФУНКЦИИ ФУНУЦИИ////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//функция рисует окружность диаметром d
///////////////////////////////////////
void Okr(float d)
{
up_down_pen(true);//опустим перо
for (byte i=0;i<12;i++)
{
  DrawVector(PI*d/12,30*i);
  }
   
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//функция рисует равносторонний треугольник со стороной d, наклонённый под углом a (больше 0, меньше 60 градусов)
///////////////////////////////////////
void Treug(int d, int a)
{
up_down_pen(true);//опустим перо
DrawVector(d,60-a); DrawVector(d,300-a); DrawVector(d,180-a);
   
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//функция рисует квадрат со стороной d, наклонённый под углом a (больше 0, меньше 90 градусов)
///////////////////////////////////////
void Kvad(int d, int a)
{
up_down_pen(true);//опустим перо
DrawVector(d,90+a); DrawVector(d,0+a); DrawVector(d,270+a); DrawVector(d,180+a);
 
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// фунуция рисует линию длины d в направлении a(в градусах)
//либо переставляет перо на конец вектора, при отрицательных d
void DrawVector(float d, float a)
{
  if (d > Dmax || a < 0 || a > 359)return; // не корректные параметры
  if (CurL == 1000 || CurQ == 1000)return; // не задана начальная точка
  if (d < 0) //задана перестановка пера
  {
    //up_down_pen(false);//поднимем перо
    d = abs(d);
    GoToFinLine(d, a);
  } else //задано рисование линии
  {
    up_down_pen(true);//опустим перо
    int n = d / Dstep; //разобьем линию на n отрезков.
    for (int i = 1; i <= n; i++)GoToFinLine(Dstep, a);//нарисуем отрезки по очереди
    d -= n * Dstep;
    if (d > 0)GoToFinLine(d, a); //последнюю точку нарисуем отдельно для точности.
  }
}
// функция перемещает перо в конец заданного вектора
void GoToFinLine(float d,float a)
{
  if(StopFlag)return;
  //определим координаты конца вектора
    float l=CurL+d*sin(GradToRad(90+a-CurQ));
    float g=CurQ-(180*asin(d*cos(GradToRad(90+a-CurQ))/CurL))/PI;
   //переместим перо
    SetServosToPoint(l,g);
    delay(n*d);// выдержка времени для отработки механизма, зависящая от длины пути.
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Функция выставляет servo1 servo2, на точку с декартовыми координатами Х,Y
//X,Y расстоямие в мм
void SetServosToPointXY(float X, float Y)
{
  float l; float q;
  if(X==0){l=Y;q=90;}
  if (X>0){q=(180/PI)*asin((Y/X)/sqrt(1+((Y*Y)/(X*X))));l=Y/sin(PI*q/180);}
  if (X<0){q=180-((180/PI)*asin((Y/abs(X))/sqrt(1+((Y*Y)/(X*X)))));l=Y/sin(PI*(180-q)/180);}
  SetServosToPoint(l,q);

}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Функция выставляет servo1 servo2, на точку с полярными координатами L,Q
//L расстоямие в мм от полюса,Q угол от полярной оси в градусах
void SetServosToPoint(float L, float Q)
{

  if(L>=Lmax ||L<=Lmin  ||Q>= Qmax ) return;
  float lp=65; //длина одного из равных плеч
  float B=acos(1.00-(L*L)/(2*lp*lp));
  float A=(PI*Q/180)+(B/2)-(PI/2);
// Serial.print("A= ");
  //Serial.println(180*A/PI);
// Serial.print("B= ");
  //Serial.println(180*B/PI);
  servo1.writeMicroseconds(RadianToMcs(A)+Acor1);
  servo2.writeMicroseconds(RadianToMcs(B)+Acor2);
  delay(5*n);
  CurL=L;
  CurQ=Q;

// Serial.print("Current point: L= ");
// Serial.print(L);
// Serial.print(", Q= ");
// Serial.println(Q);
}
//////////////////////////////////////////////////////////////////////
//функция перевода радиан в микросекунды для управления сервоприводами
int RadianToMcs(float rad)
{
  int grad=180*rad/PI;
  grad=map(grad, 0, 180, 500, 2500);
  return grad;
}
/////////////////////////////////////////////////////////////////////
float GradToRad(float grad)
{
  float rad=PI*grad/180;
  return rad; 
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////функция поднимания-опускания фломастера (значения аргумента false и true  соответственно)/////
void  up_down_pen(boolean  k)
{
  while (a3>85&&k==1)
  {servo3.write(a3);a3=a3-1;delay(n);}if(k== true ){a3=85;}
   while (a3<a03&&k==0)
  {servo3.write(a3);a3=a3+1;delay(n);}if (k==false){a3=a03;}
  }
  /////////////////////////////////////////////////////////////////////////////////////////////////
//ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ ДАННЫХ
void CheckSerial()
{
//////////////////////////////////////////////////////////////////////////////
  while (Serial.available())//считываем строку данных пока они поступают
  {
    char inChar = (char)Serial.read();
    if (inChar == '\n')     //если окончание строки
    {
      MakeCmd();//обрабатываем её данной функцией
      break;
    }
    else inputString += inChar;// иначе удлиняем строку на один символ
  }
}
/////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void MakeCmd()
{
    int y=inputString.length();// присваиваем переменной у число символов в строке
    if (y<3||y>3)return;//если их меньше 3 или больше, выходим из функции
    String cmd=inputString;// передаём строку другой переменной
    inputString = "";//"обнуляем переменную"

if (cmd=="DOM"){RisunokDomik ();}//РИСУЕМ ДОМИК
if (cmd=="KUB"){ RisunokKubik ();}//РИСУЕМ КУБИК 
if (cmd=="CVE"){RisunokCvetok();}//РИСУЕМ ЦВЕТОК
}

///////////////////////////////////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //////////////////////// РИСУНКИ РИСУНКИ РИСУНКИ РИСУНКИ РИСУНКИ РИСУНКИ РИСУНКИ РИСУНКИ РИСУНКИ РИСУНКИ ///////////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void RisunokDomik ()
   {
  SetServosToPoint (80,110);// стены, крыша
   DrawVector(20,90);DrawVector(10,180);DrawVector(14,45);DrawVector(20,0);DrawVector(14,315);DrawVector(10,180);
   DrawVector(20,270);DrawVector(20,180);DrawVector(20,90);DrawVector(22,0);
   up_down_pen (false);
   
   SetServosToPoint (85,103);//окошко
   DrawVector(7,90);DrawVector(7,0);DrawVector(7,270);DrawVector(7,180);
    up_down_pen (false);

    SetServosToPoint (107,100);//труба
   DrawVector(7,90);DrawVector(5,0);DrawVector(7,270);DrawVector(5,180);
    up_down_pen (false);

     SetServosToPoint (75,100);//дорожка
   DrawVector(40,0);
    up_down_pen (false);
    SetServosToPoint (70,103);
     DrawVector(40,0);
    up_down_pen (false);
   
    SetServosToPointXY(20,90);Okr(15);//солнышко

     SetServosToPointXY(5,95); DrawVector(10,20);up_down_pen (false);SetServosToPointXY(5,85); DrawVector(10,45);up_down_pen (false);SetServosToPointXY(10,80); DrawVector(10,70);up_down_pen (false);
     SetServosToPointXY(5,105); DrawVector(10,330);up_down_pen (false);SetServosToPointXY(15,80); DrawVector(10,80);up_down_pen (false);SetServosToPointXY(20,80); DrawVector(10,80);up_down_pen (false);
     SetServosToPointXY(10,110); DrawVector(10,320);up_down_pen (false);SetServosToPointXY(20,107); DrawVector(10,120);up_down_pen (false);SetServosToPointXY(25,107); DrawVector(10,90);up_down_pen (false);

    for (int z=0;z<9;z++)// заборчик
     {
       SetServosToPointXY(-45+2*z,75); DrawVector(12,90);DrawVector(4,300);up_down_pen (false);
      }
        SetServosToPointXY(-45,75); DrawVector(20,0);up_down_pen (false);
      }
     
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void RisunokKubik ()
   {
   SetServosToPointXY(-20,75);Kvad(20,0);up_down_pen (false);// сам кубик
  SetServosToPointXY(-20,95);DrawVector(15,45);up_down_pen (false);
  SetServosToPointXY(0,95);DrawVector(13,47);up_down_pen (false);
  SetServosToPointXY(0,75);DrawVector(15,45);up_down_pen (false);
  SetServosToPointXY(-12,106);DrawVector(23,0);DrawVector(22,270);up_down_pen (false);

  SetServosToPointXY(-11,85);up_down_pen (true);delay(2000);up_down_pen (false);//точки на гранях
   SetServosToPointXY(8,93);up_down_pen (true);delay(2000);up_down_pen (false);
  SetServosToPointXY(2,96);up_down_pen (true);delay(2000);up_down_pen (false);
  SetServosToPointXY(3,81);up_down_pen (true);delay(2000);up_down_pen (false);
  SetServosToPointXY(9,102);up_down_pen (true);delay(2000);up_down_pen (false);
  SetServosToPointXY(10,88);up_down_pen (true);delay(2000);up_down_pen (false);
   SetServosToPointXY(-7,102);up_down_pen (true);delay(2000);up_down_pen (false);
  SetServosToPointXY(-11,104);up_down_pen (true);delay(2000);up_down_pen (false);
  SetServosToPointXY(-1,98);up_down_pen (true);delay(2000);up_down_pen (false);

  SetServosToPointXY(-23,85);DrawVector(25,215);DrawVector(45,0);DrawVector(25,45);DrawVector(8,180);up_down_pen (false);//последний штрих-контур 
   }
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void RisunokCvetok ()
   {
for(byte i=0;i<12;i++)//цветок
{
  SetServosToPointXY(5,110); DrawVector(10,i*30);up_down_pen(false);
}
  SetServosToPointXY(5,110);DrawVector(20,248);DrawVector(20,270);up_down_pen(false);//стебель,лист,горшок
  SetServosToPointXY(-4,91);DrawVector(15,135);DrawVector(13,215);DrawVector(11,20);DrawVector(15,320);up_down_pen(false);
  SetServosToPointXY(-13,73);DrawVector(20,0);DrawVector(10,225);DrawVector(7,180);DrawVector(10,135);up_down_pen(false);
  SetServosToPointXY(-8,57);Kvad(10,0);up_down_pen(false);
   }
   //////////////////////////////////////////////////////////////////////////////////////////////////////////////

Re: Вопросы новичка.

Dmitry__ » 28 июл 2018, 12:43

Scorpio писал(а):Та нармальна всёёёё!

Так я в хорошем смысле, молодец, растет. :)

Re: Вопросы новичка.

Scorpio » 28 июл 2018, 17:16

А для меня фраза:
dimamichev писал(а): просто подключить к 0 и 1

так и осталась загадкой :pardon:
Я тут, кстати, придумал, как надпись, сделанную любым шрифтом винды, преобразовать в массив отрезков для нашего графопостроителя. На эмуляторе работает нормально:
Proba.jpg

Re: Вопросы новичка.

Angel71 » 28 июл 2018, 17:45

при запуске на другой винде или при изменении каких настроек в этой, в зависимости от того, как отрисовку сделал, выглядеть может и по другому. для винформс есть настройки на подобии
Код: Выделить всёРазвернуть
Graphics.TextRenderingHint = TextRenderingHint.AntiAlias

погугли если хочешь, есть описания на подобии https://theartofdev.com/2014/04/21/text-rendering-methods-comparison-or-gdi-vs-gdi-revised/. и потести немного, настраивая в винде увеличение шрифта, тему оформления,...

Re: Вопросы новичка.

Scorpio » 28 июл 2018, 18:10

Отрисовка виндой тут не причем в данном случае. Эмулятор отсылает ардуине координаты следующей точки и опустить-поднять перо. Ардуина возвращает эмулятору ширину импульса для первой и второй сервы. Эмулятор вычисляет соответствующие углы поворота серв, рисует их положение и отрезок между предыдущей точкой и текущей. Т.е. эмулятор точно повторяет действия физического полярного графопостроителя, а не просто выводит текст на экран функциями винды. Разве что без учета несовершенной механики.

Re: Вопросы новичка.

dimamichev » 28 июл 2018, 20:00

0 или 1 имелось ввиду подсоединение к Rx,Tx без "софтсериал".
Проба очень красива-хрен реальный манипулятор нарисует, хотя надо попробовать, нарисую картинку-цифру большого размера.

Добавлено спустя 53 минуты 32 секунды:
Переделал пульт, пока просто фраза-действие, попробовать пока не могу, сыну телефон нужен.Дмитрий, в исходнике-пульте была отдельно строка-картинка "вызов ВТ.Отключиться". Она нужна? А то исчезла при переделке.
Вложения
ardunasha.zip
(3.9 КиБ) Скачиваний: 0

Re: Вопросы новичка.

Angel71 » 28 июл 2018, 20:28

Scorpio, что бы ардуине отослать данные, их сначала нужно получить и варианта всего два - работать с кривыми (у тебя явно ttf шрифт) и растеризация. при растеризации итоговый пиксельный масив будет отличаться от алгоритма, его настроек и палитры поверхности, на которой рисуешь (ргб, ргба, ч/б или ещё какой). будут грабли и как повлияют или не будет проблем, это зависит от твоего кода. хочешь, изучай тему глубже и ищи где косяки повыползать могут. не хочешь, не возись и когда/если столкнёшся с некоректной работой, тогда уже что-то и решать (как один из вариантов - это в свойствах заглянуть в настройки совместимости и настроить dpi).

Re: Вопросы новичка.

dimamichev » 29 июл 2018, 00:52

В итоге заработало, не знаю насколько стабильно долго, прогнал 3 рисунка. Ограничился пока словами одиночными домик, цветок, кубик - в ответ говорит рисую домик и т.д. (и конечно рисует). Спотыкалки такие были: слово рисуй понимает как угодно - нарисуй, рисую, рисовать. На проверку совпадения надо писать слово с маленькой буквы и без пробела (лишнее движение и нет совпадения-равенства). Кодировку в ВТ пришлось выставить ASCII.
Пора заняться лицом-экраном. Учиться вставлять картинки. С внешним видом экрана тоже пока не ясно, в инвенторе кнопка и надпись в одном месте, в приложении в другом.

Добавлено спустя 4 минуты 16 секунд:
Вот экран, в приложении кнопка левее, надпись сразу под ней. Наверное зелёный цвет кнопки надо заменить на белый, чтоб личико не затенять.
Вложения
7.jpg
6.jpg

Re: Вопросы новичка.

Scorpio » 29 июл 2018, 05:10

Вполне приличные достижения!
Советы:
- Не использовать русскоязычный интерфейс. В будущем надо будет осваивать Java и Android Studio, названия и смысл многих операторов будут уже знакомы.
- Использовать списки, с загрузкой из файла для словарей и команд. Придумай сам, как сделать - не буду подсказывать.
- Чтобы кнопки на телефоне появлялись там, где ожидаешь - надо ставить их на Layout
- Символ конца строки лучше добавить один раз в функции SendBT:
BTsend.jpg

- В разновидностях оператора if имеется else if. В твоем случае он правильнее, чем голые ифы:
if.jpg

Распознавание русской речи в телефоне лучше загрузить online. В меню андроид есть такая опция.
Если одно и тоже слово распознается по разному, то на все возможные варианты надо назначить одну и ту же команду.


dimamichev писал(а):, в исходнике-пульте была отдельно строка-картинка "вызов ВТ.Отключиться". Она нужна? А то исчезла при переделке.

BT.jpg

Можно и без нее. Наверно и сам отключится.

Re: Вопросы новичка.

dimamichev » 29 июл 2018, 08:31

Попробовал с картинкой,вставляется, но важной функции в меню по замене одной картинки на другую не нахожу. Что я не понимаю?

Добавлено спустя 2 минуты 37 секунд:
Кстати и условие в "другом подменю" - "иначе,если" тоже не вижу.
Функцию переделал.
Вложения
7.jpg


Rambler\'s Top100 Mail.ru counter