roboforum.ru

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


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

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

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

Сообщение dimamichev » 22 июл 2018, 11:06

Завершил скетч варианта игры с соперником через монитор порта. Вставил "брекеты", плавность хода, оставил шесть функций: расстановки шашек себе или противнику, уборка с поля, ход с клетки на клетку, удаление шашки с клетки в корзину, постановка шашки из корзины на клетку.
После упорной 40 минутной игры с самим собой и клацанья по клавишам-кнопкам пришёл к выводу: надо свести реализацию каждой из функций к одной записи в монитор порта типа с таким же откликом - A3B4 (шашку с одной клетки на другую), или R1B4,B4U0 (поставить из корзины на клетку, убрать с клетки в корзину), или R1U0,U0R1 (расставить шашки, убрать шашки). Хотя сам в детстве, когда играл в шашки никогда не пользовался системой координат A1-H8.

Добавлено спустя 9 минут 18 секунд:
Про физическую регулировку скорости вращения вала сервы: нашёл схему для sg90. Точнее вариант, который скорее всего в ней реализуется. Пока на ум кроме диодного моста с транзистором по диагонали - в разрыв провода к мотору - не приходит. Но тоже спорный момент.
Вложения
ref-design.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1302
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение dimamichev » 22 июл 2018, 17:38

Ввёл такую штуку.
Код: Выделить всёРазвернуть
String cmdD="A1C1E1G1B2D2F2H2A3C4E3G3B4D4F4H4A5C5E5G5B6D6F6H6A7C7E7G7B8D8F8H9R1U0";

Изменил функцию по приёму данных
Код: Выделить всёРазвернуть
void MakeCmd()
{
    int y=inputString.length();// присваиваем переменной у число символов в строке
    if (y<4||y>4)return;//если их меньше 4 или больше выходим из функции
    String cmd=inputString;// передаём строку другой переменной
    inputString = "";//"обнуляем переменную"
/////////////////////////////////////////   
String cmdD1=cmd.substring(0,2);//отрезаем первые два символа   
String cmdD2=cmd.substring(2);// отрезаем с третьего до конца - последние два символа
////////////////////////////////////////
if (cmd=="R1U0"){delay(2000);Uborka();SendMail("UBORKA");}//уборка шашек со всего поля, отсылаем команду R1U0 
if (cmd=="U0R1"){delay(5000);Rasstanovka();SendMail("RASSTANOVKA");}// расстановка шашек для двух игроков
if (cmd!="R1U0"&&cmd!="U0R1"){Hod(cmdD1,cmdD2);SendMail(cmd);} //произвести ход шашкой с одной клетки поля на другую, например A3B4 или с поля в корзину A3U0, или из корзины на клетку R1A3
}

И сделал такую функцию
Код: Выделить всёРазвернуть
void Hod(String cmdd1,String cmdd2)
  {
     for(byte ka=0;ka<=65;ka=ka+2)
  {
    if (cmdD.substring(ka,ka+2)==cmdd1)
    {
      SetServosToPoint(tablX[ka/2],tablY[ka/2]);
      up_down_pen(true);digitalWrite(Pin, HIGH);
      delay(5*n);up_down_pen(false);
      break;
    }
   }
   ///////////////////////////////////
   for(byte ka=0;ka<=67;ka=ka+2)
  {
   if (cmdD.substring(ka,ka+2)==cmdd2)
    {
      SetServosToPoint(tablX[ka/2],tablY[ka/2]);
      if(cmdd2!="U0"){up_down_pen(true);}
      digitalWrite(Pin, LOW);
      delay(5*n);up_down_pen(false);
       break; 
    }
  }
  delay(5*n);
  SetServosToPoint(nx,ny);//установим захват в исходное положение
  }

Играть стало гораздо быстрее и веселее. Вариант "мониторный" готов.
Аватара пользователя
dimamichev
 
Сообщения: 1302
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 22 июл 2018, 19:11

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

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

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

Честно, не ожидал такого результата, от слова совсем.
Вложения
20180722_213651.jpg
20180722_213646.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1302
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 23 июл 2018, 00:28

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

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

Сообщение Scorpio » 23 июл 2018, 21:03

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

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

Сообщение dimamichev » 23 июл 2018, 21:37

Попробовал, проскакивает чаще COM4 серого цвета, но стабильной связи нет. Может в скетче чего не так?
Код: Выделить всёРазвернуть
///////////// МАНИПУЛЯТОР ДЛЯ ИГРЫ В ШАШКИ  //////////////////////////////
#include <Servo.h>
////////////////////////////////////////////////////////////////
#define L1 65  //длина первого плеча манипулятора в мм.
#define L2 65  //длина второго плеча манипулятора в мм.
#define Xmax 120//значение граничных координат
#define Ymax 120//значение граничных координат
#define Acor1 352//поправка на посадку качалки сервы 1
#define Acor2 220//поправка на посадку качалки сервы 2
#define Ymin 50//значение граничных координат
#define Pin 8//вывод для подключения электромагнита
#define nx -25
#define ny 58 //начальные координаты первой игровой клетки (11)
////////////////////////////////////////////////////////////////
int CurX;int CurY;
byte a03=125;
byte a3=a03;
int n=20;//переменная единицы временного интервала

int tablX[41]={ nx,-12,1,14,
                -19,-5,8,21,
                -26,-12,1,14,
                -20,-5,9,22,
                -27,-12,3,18,
                -20,-5,11,25,
                -27,-12,3,18,
                -20,-5,11,26,
                80,30,30,30,30,30,30,30,30};
int tablY[41]={ny,58,58,58,
               66,64,66,68,
               74,73,73,73,
               82,80,83,83,
               92,92,92,92,
               100,98,100,100,
               107,107,107,107,
               115,115,115,116,
               90,58,68,73,83,92,100,107,116};// массивы координат клеток игровых
byte tablP[41]={11,13,15,17,22,24,26,28,31,33,35,37,42,44,46,48,51,53,55,57,62,64,66,68,71,73,75,77,82,84,86,88, 0, 19,29,39,49,59,69,79,89}; //массив перекодировки игровых клеток             
///////////////////////////////////////////////////////////////
Servo servo1;
Servo servo2;
Servo servo3;
String inputString;
bool echo=false; //отладка
int ConnectCount=60;
bool AdjustModo;

void setup() {
Serial.begin(19200);

servo1.attach(5);
servo2.attach(6);
servo3.attach(7);
servo3.write(125);
pinMode(Pin, OUTPUT);digitalWrite(Pin, LOW);
////////////////////////
  SendMail("RBT!");
////////////////////////
up_down_pen(false);//поднимем захват
SetServosToPoint(nx,ny);//установим захват в исходное положение
delay_(50*n);
}

void loop()
  {
   
   CheckSerial();
  }
  /////////////////////////////////////////////////////////////////
  ////функция не задействованная
  void NewGame()
  {}
  //////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////
  ////функция не задействованная
  void NXTServo_SetStandart()
  {}
  //////////////////////////////////////////////////////////////////
  ///функция включения сервоприводов и задания начального положения
void Servo_Power(bool flag)
{
  if (flag==true)
  {
Servo servo1;
Servo servo2;
Servo servo3;
servo1.attach(5);//включить сервоприводы
servo2.attach(6);
servo3.attach(7);
servo3.write(125);
pinMode(Pin, OUTPUT);digitalWrite(Pin, LOW);
up_down_pen(false);//поднимем захват
SetServosToPoint(nx,ny);//установим захват в исходное положение
delay_(50*n);
   }
}
  ///////////////////////////////////////////////////////////////////
  /////////функция остановки игры,снятия питания/////////////////////
void Exit()
{
SetServosToPoint(nx,ny);//установим захват в исходное положение
delay_(5*n);up_down_pen(false);
delay_(5*n);
servo1.detach();//отключим сервоприводы
servo2.detach();
servo3.detach();
 
}
  //////////////////////////////////////////////////////////////////////
  //функция выполнения хода, например - выполнить простой ход "33:44"
void SimpleMov(String mov)
{
  int tmp=(mov.substring(0,2)).toInt();//преобразовали первые два знака строки в код поля "откуда"
  TakePiez((byte)tmp);//взяли шашку
  tmp=(mov.substring(3)).toInt();//преобразовали последние два знака строки в код поля "куда"
  MoveToCell((byte)tmp); //переместили
  PutPiez2((byte)tmp);//опустили
  delay_(5*n);
  SetServosToPoint(nx,ny);//установим захват в исходное положение
}
  //////////////////////////////////////////////////////////////////////
  ///функция поднимания шашки с игрового поля под номером N=11 (TAP11)
  /////////////////////////////////////////////////////////////////////
void TakePiez (byte N)
{
  for(byte ka=0;ka<=40;ka++)
  {
    if (tablP[ka]==N)
    {
      SetServosToPoint(tablX[ka],tablY[ka]);
      up_down_pen(true);digitalWrite(Pin, HIGH);
      delay_(5*n);up_down_pen(false);
      break;
    }
  }
  }
  //////////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////////
  ///функция перемещения каретки-магнита на игровую клетку под номером N=11 (MTC11)
  /////////////////////////////////////////////////////////////////////
void MoveToCell (byte N)
{
  for(byte ka=0;ka<=40;ka++)
  {
    if (tablP[ka]==N)
    {
      SetServosToPoint(tablX[ka],tablY[ka]);
       break;
    }
  }
  }
  //////////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////////
  ///функция постановки шашки на игровую клетку поля под номером N=11
  //без отпускания - обозначение хода(PUC11)ИЛИ с отпусканием шашки (PUO11)
  /////////////////////////////////////////////////////////////////////
void PutPiez1 (byte N)
{
  for(byte ka=0;ka<=40;ka++)
  {
    if (tablP[ka]==N)
    {
     
      SetServosToPoint(tablX[ka],tablY[ka]);
      delay_(5*n);
      up_down_pen(true);
      delay_(5*n);
       break; 
    }
  }
  }
  //////////////////////////////////////////////////////////////////////
   ///функция постановки шашки на игровую клетку поля под номером N=11
  //без отпускания - обозначение хода(PUC11)ИЛИ с отпусканием шашки (PUO11)
  /////////////////////////////////////////////////////////////////////
void PutPiez2 (byte N)
{
  for(byte ka=0;ka<=40;ka++)
  {
    if (tablP[ka]==N)
    {
      SetServosToPoint(tablX[ka],tablY[ka]);
      up_down_pen(true);digitalWrite(Pin, LOW);
      delay_(5*n);up_down_pen(false);
      break;
    }
  }
  }
  //////////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////////
  ///функция удаления  шашки с игрового поля под номером N=11 (DEP11)
  /////////////////////////////////////////////////////////////////////
void DeletePiez (byte N)
{
  for(byte ka=0;ka<=40;ka++)
  {
    if (tablP[ka]==N)
    {
      SetServosToPoint(tablX[ka],tablY[ka]);
      up_down_pen(true);digitalWrite(Pin, HIGH);
      delay_(5*n);up_down_pen(false);
      SetServosToPoint(tablX[32],tablY[32]);
      delay_(30*n);digitalWrite(Pin, LOW);
      SetServosToPoint(nx,ny);
       break;
    }
  }
  }
  //////////////////////////////////////////////////////////////////////
//Функция выставляет servo1 servo2, на точку с координатами X,Y
//X<0 для левого квадранта, X>0 для правого
void SetServosToPoint(int X, int Y)
{
  if(abs(X)>Xmax || Y>Ymax || Y<Ymin) return;
  X=-X;
  float L=sqrt(X*X+Y*Y);
  float a1=acos(X/L);
  float a2=acos((L*L+L1*L1-L2*L2)/(2*L*L1));
  float A=a1+a2;
  A=PI-A;// вариант, если серва1 повернута на 180°
  float b1=PI/2-a1;
  float B=acos((L2*L2 + L1*L1 - L*L) / (2*L2 * L1));
//////////////////////////////////////////////////////////////////////////
int A2=180*A/PI+Acor1/11; int B2=180*B/PI+Acor2/11;
while (servo1.read()!=A2)
  {
    delay_(n/2);
    if (servo1.read()>A2){ servo1.write(servo1.read()-1);}
    else {servo1.write(servo1.read()+1);}
  }
     while (servo2.read()!=B2)
    {
     delay_(n/2);
    if (servo2.read()>B2){ servo2.write(servo2.read()-1);}
    else {servo2.write(servo2.read()+1);}
    }
/////////////////////////////////////////////////////////////////////////
  servo1.writeMicroseconds(RadianToMcs(A)+Acor1);
  servo2.writeMicroseconds(RadianToMcs(B)+Acor2);
  delay_(n);
  CurX=X;CurY=Y;   
}
////////////////////////////////////////////////////////////////////////
//Функция перевода радиан в микросекунды для управления сервоприводами
int RadianToMcs(float rad)
{
int grad=2000*rad/PI+500;

return grad;
}
//////////////////////////////////////////////////////////////////////
//////Функция поднимания-опускания фломастера (значения аргумента false и true  соответственно)/////
void  up_down_pen(boolean  ka)
{
  while (a3>85&&ka==1)
  {servo3.write(a3);a3=a3-1;delay_(n);}if(ka== true ){a3=85;}
   while (a3<a03&&ka==0)
  {servo3.write(a3);a3=a3+1;delay_(n);}if (ka==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(echo)Serial.println("PC-> "+inputString);
    if (y<3)return;
    String cmd=inputString;
    inputString = "";
   
    if (cmd.startsWith("RBT?")){ConnectCount=60; SendMail("RBT!");} //подтверждение связи (подтверждение от PC должно приходить как минимум раз в 5 секунд)
    else if (cmd.startsWith("ECH")){echo=!echo;if(echo)SendMail("ECHO ON");else SendMail("ECHO OFF");}// отладка
   // else if (cmd.startsWith("VER")){SendMail(VER);}
    else if (cmd.startsWith("END")){Exit();}// остановить игру, снять питание
    else if (cmd.startsWith("INI")){Servo_Power(true);SendMail("INI");} //включить сервы, задать исходную позицию
    else if (cmd.startsWith("NEW")){Servo_Power(true);NewGame();SendMail("NEW");} //произнести приветствие перед началом новой игры
    //else if (cmd.startsWith("TLK"))Lisp(); // начать движени ртом
    //else if (cmd.startsWith("TLN"))TalkFlag=false; // закончить движени ртом
    else if (cmd.startsWith("EMO")){SendMail("EMO");}// выставляет стандартные положения эмоций
    //else if (cmd.startsWith("LTC")){PlayEmotion(5);SendMail("LTC");}//посмотреть в центр поля
   // else if (cmd.startsWith("THI"))Thinking(); // начать изображать мыслительный процесс
   // else if (cmd.startsWith("THS")){ThinkFlag=false;WaitFlag=false;} // закончить
    else if (cmd.startsWith("TAP")){TakePiez(GetNumber(cmd));SendMail("TAP");}// поднять шашку с поля  (TAP11)
    else if (cmd.startsWith("MTC")){MoveToCell(GetNumber(cmd));SendMail("MTC");}// переместить каретку на поле (MTC11)
    else if (cmd.startsWith("PPC")){PutPiez1(GetNumber(cmd));SendMail("PPC");}// опустить не разжимая челюсти (обозначить ход)(PPC11)
    else if (cmd.startsWith("PPO")){PutPiez2(GetNumber(cmd));SendMail("PPO");}// опустить шашку (PPO11)
    else if (cmd.startsWith("DEP")){DeletePiez(GetNumber(cmd));SendMail("DEP");}// удалить шашку с поля (DEP11)
    else if (cmd.startsWith("SMO")){SimpleMov(cmd.substring(3));SendMail("SMO");} // выполнить простой ход MOV33:44
 
    //else if (cmd.startsWith("PCC"))PCFlag=true;
    else if (cmd.startsWith("STD")){NXTServo_SetStandart();SendMail("STD");}
    else if (cmd.startsWith("ADJ")){AdjustModo=true;}
}
byte GetNumber(String cmd)
{
  int tmp=(cmd.substring(3)).toInt();
  return(byte)tmp;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
void SendMail(String mail)                  // ОТПРАВКА СООБЩЕНИЙ
{
  Serial.println(mail);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
void ErrMsg(String msg)
{
Serial.print("ERROR: ");
Serial.println(msg);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////   ФУНКЦИИ ОПИСАНИЕ   //////////////////////////////////////////////////////
//Функция земеняет выполнение команды delay(T1); в ней на время паузы статичного поведения сервоприводов проверяется связь с компьютером
void delay_(int T1)
{
  long Y2=millis();
  while((millis()- Y2)<T1)CheckSerial();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Аватара пользователя
dimamichev
 
Сообщения: 1302
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 23 июл 2018, 21:50

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

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

Сообщение dimamichev » 23 июл 2018, 22:11

На игровом поле шашки не различает, отсюда мысль датчик делать большим и стационарным, возле кормушки-раздачи шашек, подобрать положение что бы пальцам не мешало и электромагниту тоже. Ну а дальше...прежде чем он кинется к кормушке, проверять уровень датчика... Глядючи на манипулятор, чего то навеяло - курица клюёт шашку в одном месте, а вылетает в другом...
Аватара пользователя
dimamichev
 
Сообщения: 1302
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Dmitry__ » 23 июл 2018, 23:33

dimamichev писал(а):На игровом поле шашки не различает, отсюда мысль датчик делать большим и стационарным

Как вообще возникло желание инфракрасным датчиком определять цвет? :shock:
В яндекс: "датчик цвета arduino"
http://xn--18-6kcdusowgbt1a4b.xn--p1ai/%D0%B4%D0%B0%D1%82%D1%87%D0%B8%D0%BA%D0%B0-%D1%86%D0%B2%D0%B5%D1%82%D0%B0-%D0%B0%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5/
http://arduino-diy.com/arduino-datchik-tsveta
https://ru.aliexpress.com/popular/arduino-color-sensor.html

Еще один Димка. Его держат в заложниках, привязанным к собственной кровати, и заставляют снимать большое колич. видео про ардуино. Иногда дают ему пить чай, прямо во время сьемки. Иногда в кадре он голый :)


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

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

Сообщение Scorpio » 24 июл 2018, 00:00

Нормально ИК цвет определяет по степени отражения. Нам же не цвет нужен как таковой, а разницу между сигналами.
Наличие миниатюрного датчика на захвате робота, будет более впечатляющим. С этим вариантом, робот может определить, например, что у него украли шашку с поля, а не тупо переставлять пустой захват. Датчик будет более надежно работать, если цвета шашек будут более контрастны друг к другу и к полю.
Вариант со стационарным датчиком – ссыпать убранные шашки в сепаратор, из которого они будут вылезать по одной на место для захвата, проходя по пути через датчик цвета. Сепаратор будет сделать достаточно сложно, т.к. шайбы маленькие и легкие. Будут застревать или выскакивать по двое.
Другой вариант – начать, наконец, осваивать андроид, и определять местонахождение шашек по картинке с телефона.
Аватара пользователя
Scorpio
 
Сообщения: 2564
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение Dmitry__ » 24 июл 2018, 00:32

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

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

Сообщение Angel71 » 24 июл 2018, 00:39

даже не приделал термоусадку или ещё чего для защиты от засветки. хз какой спектр светодиода и чувствительность фотодиода по спектру + корпус это светофильтр. из мелочей это то, что у китайцев в одном товаре/лоте легко могут идти ик свето/фотодиоды со слегка различающимся цветом пластика - открываешь посылочку с какими qrd1114, tcrt5000,... а визуально некоторые очень даже неплохо отличаются. это как минимум необходимость калибровки каждой такой пары. не из мелочей это то, что разные диапазоны волн, никаких зависимостей нет. подсвечивая непонятно каким ик диодом (китавайцы "весёлые" конечно, могут сговноляпить хоть с бонусным уф или ещё каким неожиданным спектром), не поверишь, но фотодиод будет лучше "видеть" в ик и хуже в видимом. с чего взял, что у любых разных материалов с визуально одинаковым цветом в ик обязательно должно быть одинаковым или что в видимом разные, а в ик не могут быть одинаковыми?
1.jpg
1.jpg (30 КиБ) Просмотров: 573

2.jpg
2.jpg (30.96 КиБ) Просмотров: 573

3.jpg
3.jpg (26.28 КиБ) Просмотров: 573

4.jpg
4.jpg (26.97 КиБ) Просмотров: 574

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

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

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

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

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

Сообщение Angel71 » 24 июл 2018, 05:25

в общем случае болт тебе, а не "Черный с белым, например, точно будут надежно различаться". а в частностях всего-лишь в нужном диапазоне должно быть достаточно сильно отличаться. с ламинацией или лакировкой в случае необходимости тоже решаемо. туда же и засветку солнцем или ещё чем. только зачем эта возня с невидимым для глаза диапазоном, когда можно сразу выбрать получше вариант и меньше неожиданностей выхватывать?
Аватара пользователя
Angel71
 
Сообщения: 10644
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Пред.След.

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

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

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

cron
Mail.ru counter