Роботизированная лазерная указка для кошки на Arduino


Контроллер Arduino Uno, пара сервомашинок (для наклонно-поворотного механизма) и лазерная указка — вот и всё, что потребуется, чтобы самостоятельно сделать интерактивную игру для своего кота или кошки.

Код для Arduino — LaserCat.ino

// Include Libraries
#include "Arduino.h"
#include "BTHC05.h"
#include "VarSpeedServo.h"

// Pin Definitions
#define BTHC05_PIN_RXD	10
#define BTHC05_PIN_TXD	11
#define LASER_PIN_S	2
#define SERVO9G1_PIN_SIG	3
#define SERVO9G2_PIN_SIG	4

// Global variables and defines
// object initialization
VarSpeedServo servo9g1;
VarSpeedServo servo9g2;
BTHC05 bthc05(BTHC05_PIN_RXD, BTHC05_PIN_TXD);

bool laserState = 0;
bool autoplayState = 0;

const int servoSpeed = 10;
const int seqIntervalDelta = 50;
const int manualyServoMinStep = 5;
const int manualyServoMaxStep = 20;
const int minimalRangeSize = 10;

// Change these parameters to define the rectangular play area
int servo1Min = 80;
int servo1Max = 110;
int servo2Min = 20;
int servo2Max = 50;

int servo1pos = (servo1Min + servo1Max) / 2;
int servo2pos = (servo2Min + servo2Max) / 2;
int delayVal = 300;


// Setup the essentials for your circuit to work. It runs first every time your circuit is powered with electricity.
void setup()
{
  // Setup Serial which is useful for debugging
  // Use the Serial Monitor to view printed messages
  Serial.begin(9600);
  while (!Serial) ; // wait for serial port to connect. Needed for native USB
  Serial.println("start");

  bthc05.begin(9600);
  //This example uses HC-05 Bluetooth to communicate with an Android device.
  //Download bluetooth terminal from google play store, https://play.google.com/store/apps/details?id=Qwerty.BluetoothTerminal&hl=en
  //Pair and connect to 'HC-05', the default password for connection is '1234'.
  //You should see this message from your arduino on your android device
  bthc05.println("Bluetooth On....");

  servo9g1.attach(SERVO9G1_PIN_SIG);         // 1. attach the servo to correct pin to control it.
  servo9g2.attach(SERVO9G2_PIN_SIG);         // 1. attach the servo to correct pin to control it.
  pinMode(LASER_PIN_S, OUTPUT);
  // start with laser off
  digitalWrite(LASER_PIN_S, laserState);
  servo9g2.write(servo2pos , servoSpeed);
  servo9g1.write(servo1pos , servoSpeed);
}

// Main logic of your circuit. It defines the interaction between the components you selected. After setup, it runs over and over again, in an eternal loop.
void loop()
{
  String bthc05Str = "";
  //Receive String from bluetooth device
  if (bthc05.available())
  {
    //Read a complete line from bluetooth terminal
    bthc05Str = bthc05.readStringUntil('\n');
    // Print raw data to serial monitor
    // Serial.print("BT Raw Data: ");
    // Serial.println(bthc05Str);
  }

  // Settings
  // Turn laser On/Off
  if (bthc05Str == "Laser On/Off") {
    laserState = !laserState;
    digitalWrite(LASER_PIN_S, laserState);
    Serial.print("Laser: ");
    Serial.println(laserState);
  }
  // decrease the delay between random points in Autoplay mode
  else if (bthc05Str == "Speed Up") {
    delayVal -= seqIntervalDelta;
    Serial.print("delay: ");
    Serial.println(delayVal);
  }
  // increase the delay between random points in Autoplay mode
  else if (bthc05Str == "Speed Down") {
    delayVal += seqIntervalDelta;
    Serial.print("delay: ");
    Serial.println(delayVal);
  }
  // Enable Autoplay - random points
  else if (bthc05Str == "Autoplay") {
    autoplayState = !autoplayState;
    Serial.print("AutoPlay: ");
    Serial.println(autoplayState);
  }
  // Widen the servo margins
  else if (bthc05Str == "Area +") {
    servo1Min -= 5;
    servo1Max += 5;
    servo2Min -= 5;
    servo2Max += 5;

    servo1Min  = constrain(servo1Min, 0, servo1Max);
    servo1Max  = constrain(servo1Max, servo1Min, 180);
    servo2Min  = constrain(servo2Min, 0, servo2Max);
    servo2Max  = constrain(servo2Max, servo2Min, 180);
    Serial.print("Area +: ");
    char buf[20];
    sprintf(buf, "%d,%d,%d,%d", servo1Min, servo1Max, servo2Min, servo2Max);
    Serial.println(buf);
  }
  // tighten the servo margins
  else if (bthc05Str == "Area -") {
    if (servo1Max - servo1Min > minimalRangeSize) {
      servo1Min += 5;
      servo1Max -= 5;
    }
    if (servo2Max - servo2Min > minimalRangeSize) {
      servo2Min += 5;
      servo2Max -= 5;
    }
    Serial.print("Area -: ");
    char buf[20];
    sprintf(buf, "%d,%d,%d,%d", servo1Min, servo1Max, servo2Min, servo2Max);
    Serial.println(buf);
  }


  // Functionality
  if (autoplayState || bthc05Str == "Random Position") {
    servo9g2.write(random(servo2Min, servo2Max), servoSpeed);
    servo9g1.write(random(servo1Min, servo1Max), servoSpeed);
    // waits until servos reaches destination
    servo9g2.wait();
    servo9g1.wait();
    delay(random(delayVal, delayVal * 5));
  }
  else {
    // Move the laser manually in random size steps from 5 - 20 deg
    if (bthc05Str == "Up") {
      servo2pos += random(manualyServoMinStep, manualyServoMaxStep);
      servo2pos = constrain(servo2pos, servo2Min, servo2Max);
      servo9g2.write(servo2pos, servoSpeed);
      // waits until servo reaches destination
      servo9g2.wait();
      Serial.println(servo2pos);
    }
    else if (bthc05Str == "Down") {
      servo2pos -= random(manualyServoMinStep, manualyServoMaxStep);
      servo2pos = constrain(servo2pos, servo2Min, servo2Max);
      servo9g2.write(servo2pos, servoSpeed);
      // waits until servo reaches destination
      servo9g2.wait();
      Serial.println(servo2pos);
    }
    else if (bthc05Str == "Left") {
      servo1pos += random(manualyServoMinStep, manualyServoMaxStep);
      servo1pos = constrain(servo1pos, servo1Min, servo1Max);
      servo9g1.write(servo1pos, servoSpeed);
      // waits until servo reaches destination
      servo9g1.wait();
    }
    else if (bthc05Str == "Right") {
      servo1pos -= random(manualyServoMinStep, manualyServoMaxStep);
      servo1pos = constrain(servo1pos, servo1Min, servo1Max);
      servo9g1.write(servo1pos, servoSpeed);
      // waits until servo reaches destination
      servo9g1.wait();
    }
  }
}

Ссылки
How to Make an Interactive Cat Laser Pointer

По теме
Arduino+LEGO+лазерная указка = индикатор времени для сна

Arduino
Ардуино что это и зачем?
Arduino, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение