roboforum.ru

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

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

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

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

Сообщение dimamichev » 27 июл 2018, 20:20

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

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

Добавлено спустя 1 час 59 минут 4 секунды:
Заработало только с кнопкою дополнительной.
Вложения
5.jpg
4.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 27 июл 2018, 22:45

Делаешь успехи! Посмотри операторы раблты с текстом. Там есть объединение нескольких фраз в один текст. После получения распознаной фразы, добавляешь "Ты сказал " и отправляешь сразу в синтезатор.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 27 июл 2018, 23:02

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

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

Сообщение Dmitry__ » 28 июл 2018, 00:53

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

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

Не отец, но мужчина :crazy:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Scorpio » 28 июл 2018, 03:38

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

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

ВТ модуль конечно подключается к СОМ порту (ты вроде уже подключал) и передавать все что хочешь, точно как в терминале IDE Arduino. Не забывай добавлять в конце строки "\n" (новая строка), чтобы дуня съела строку целиком.
NewLine.jpg
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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);
   }
   //////////////////////////////////////////////////////////////////////////////////////////////////////////////
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Dmitry__ » 28 июл 2018, 12:43

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

Так я в хорошем смысле, молодец, растет. :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Scorpio » 28 июл 2018, 17:16

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

так и осталась загадкой :pardon:
Я тут, кстати, придумал, как надпись, сделанную любым шрифтом винды, преобразовать в массив отрезков для нашего графопостроителя. На эмуляторе работает нормально:
Proba.jpg
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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/. и потести немного, настраивая в винде увеличение шрифта, тему оформления,...
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

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

Сообщение Scorpio » 28 июл 2018, 18:10

Отрисовка виндой тут не причем в данном случае. Эмулятор отсылает ардуине координаты следующей точки и опустить-поднять перо. Ардуина возвращает эмулятору ширину импульса для первой и второй сервы. Эмулятор вычисляет соответствующие углы поворота серв, рисует их положение и отрезок между предыдущей точкой и текущей. Т.е. эмулятор точно повторяет действия физического полярного графопостроителя, а не просто выводит текст на экран функциями винды. Разве что без учета несовершенной механики.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 28 июл 2018, 20:00

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

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

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

Сообщение Angel71 » 28 июл 2018, 20:28

Scorpio, что бы ардуине отослать данные, их сначала нужно получить и варианта всего два - работать с кривыми (у тебя явно ttf шрифт) и растеризация. при растеризации итоговый пиксельный масив будет отличаться от алгоритма, его настроек и палитры поверхности, на которой рисуешь (ргб, ргба, ч/б или ещё какой). будут грабли и как повлияют или не будет проблем, это зависит от твоего кода. хочешь, изучай тему глубже и ищи где косяки повыползать могут. не хочешь, не возись и когда/если столкнёшся с некоректной работой, тогда уже что-то и решать (как один из вариантов - это в свойствах заглянуть в настройки совместимости и настроить dpi).
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

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

Сообщение dimamichev » 29 июл 2018, 00:52

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

Добавлено спустя 4 минуты 16 секунд:
Вот экран, в приложении кнопка левее, надпись сразу под ней. Наверное зелёный цвет кнопки надо заменить на белый, чтоб личико не затенять.
Вложения
7.jpg
6.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 29 июл 2018, 05:10

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

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

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


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

BT.jpg

Можно и без нее. Наверно и сам отключится.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 29 июл 2018, 08:31

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

Добавлено спустя 2 минуты 37 секунд:
Кстати и условие в "другом подменю" - "иначе,если" тоже не вижу.
Функцию переделал.
Вложения
7.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Пред.След.

Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron