Как подключить телефон к машине через Bluetooth: шаг за шагом

Как подключить телефон к машине через Bluetooth: шаг за шагом Квадрокоптеры

Гоночная машинка на bluetooth управлении.

Привет всем. Здесь я представлю вам обзор автомобиля для детей, управляемого по Bluetooth.

Из-за скидки, которую продавец сделал мне после того, как я отправила ему ссылку на обзор конструктора, я поставила p.18. Честно говоря, ждать посылку пришлось долго. Я думала, что она потерялась или я привыкла к тому, как работает почта в наше время. Так как коробка не помялась при доставке, можно даже подарить. Как и любая посылка с игрушками из Китая, коробка служит еще и витриной. На каждой стороне коробки находятся изображения всех опций, доступных с этой машиной. QR-код со ссылкой на загрузку для Android и iOS – одна из полезных функций.

Как подключить телефон к машине через Bluetooth: шаг за шагом

Что предлагает производитель?

● Масштаб 1:20
● Два ведущих колеса
● Управление через блютуз
● Голосовое управление
● Программируемое движение

Открыв коробку, мы видим, что сам аппарат находится на картонной подставке, а под ним лежат некоторые аксессуары. Внутри коробки находятся отвертка и зарядное устройство, а также небольшое руководство. В процессе работы зарядное устройство слегка нагревается, но это не чрезмерно.

Как подключить телефон к машине через Bluetooth: шаг за шагом

Прежде всего, давайте посмотрим на сам автомобиль. Машина довольно интересна для ребенка, с яркими цветами и гоночным видом. Кузов автомобиля полностью изготовлен из пластика и не имеет защиты от влаги, что делает его вариантом для ровной или сухой погоды.

Как подключить телефон к машине через Bluetooth: шаг за шагом
Как подключить телефон к машине через Bluetooth: шаг за шагом
Как подключить телефон к машине через Bluetooth: шаг за шагом
Как подключить телефон к машине через Bluetooth: шаг за шагом

В нижней части машины есть отсек для аккумулятора – никель-кадмиевой батареи типа АА емкостью 700 мАч. В нижней части игрушки также есть регулируемая ручка поворота, если машина не едет прямо, и кнопка, которая включает ее.

Как подключить телефон к машине через Bluetooth: шаг за шагом

На машине стоят сменные резиновые шины, но никто не собирается их менять. Несмотря на то, что пружины носят лишь декоративный характер, передняя и задняя подвески независимы друг от друга.

Как подключить телефон к машине через Bluetooth: шаг за шагом
Как подключить телефон к машине через Bluetooth: шаг за шагом

При желании вы можете легко заменить цветную отделку автомобиля на другую. В самом корпусе находятся электронные элементы управления.

Как подключить телефон к машине через Bluetooth: шаг за шагом

После снятия верхней половины корпуса, она держится на шести винтах, и можно увидеть одну простую плату контроллера с чипом bluetooth, к которой подключены все провода, и мотор управления поворотом, сервопривода нет.

Как подключить телефон к машине через Bluetooth: шаг за шагом

На фото видна микросхема управления двигателем с изношенной маркировкой. В корпусе заднего моста установлен коллекторный двигатель и коробка передач. На шестернях имеется смазка.

Как подключить телефон к машине через Bluetooth: шаг за шагом
Как подключить телефон к машине через Bluetooth: шаг за шагом
Как подключить телефон к машине через Bluetooth: шаг за шагом
Как подключить телефон к машине через Bluetooth: шаг за шагом
Как подключить телефон к машине через Bluetooth: шаг за шагом

Загрузив QR-код, я протестировал аппарат. По поводу приложения, понятно, что оно написано в будке, но оно работает, хоть и не часто, но бывают и сбои. Помимо кнопок управления на экране в приложении, есть и голосовое управление, но это только для крайних извращенцев), команды простые, как бежать, влево, стоп. Видимо, у меня плохое произношение, потому что мои команды были сделаны через пень. Также в нем есть интересная функция “конструктор маршрута”, когда вы добавляете фрагменты маршрута, например, 2 секунды прямо направо, и машина следует по этому маршруту. Это было лучше, чем голосовое управление. Скриншоты приложения.

Как подключить телефон к машине через Bluetooth: шаг за шагом
Как подключить телефон к машине через Bluetooth: шаг за шагом
Как подключить телефон к машине через Bluetooth: шаг за шагом

На главном экране приложения расположены все иконки органов управления. Слева находится индикатор заряда батареи, однако часто он кажется просто нарисованным, так как, когда машина не ехала, он показывал 100%). Описание кнопок управления и голосовых команд представлено в меню настроек. Дополнительно есть кнопка, которая включает голосовую команду, меняет управление, переключает музыкальный трек, под который катится машина, а также кнопка для активации конструктора маршрутов. Подключение к машине осуществляется нажатием крайней правой кнопки.

На самом деле, если скинуть пять баксов, это была бы хорошая игрушка для ребенка, при условии, что я купил ее, когда она стоила $16. Если асфальт ровный, то машину можно одинаково хорошо возить и по ковру, и по асфальту. Пороги в квартире преодолеваются. Ни слишком задорно, ни слишком резво, просто гулять без телефона). Аккумулятора хватает примерно на 20 минут. Несмотря на планы сына сразу подарить племяннику, он решил сначала подарить его себе (окатал). Прошу понять, что это просто интересная игрушка для вашего ребенка, а не гоночный автомобиль для заядлого RC-споттера. На видео вы можете увидеть, как она катится в этот момент. Ребенка, в принципе, можно взять, если еще раз будут скидки. Всем спасибо за прочтение.

Для написания отзыва магазин предоставил товар. Согласно Правилам сайта, отзыв публикуется в соответствии с пунктом 18.

Обратный молоток для удаления вмятин на кузове автомобиля

СМОТРИТЕ ЗДЕСЬ.

Реверсивный молоток для удаления вмятин на кузове, который подключается к компрессору и точно не отвалится во время работы. Инструмент имеет достаточно длинный ход выбивного поршня, что делает работу намного эффективнее и проще. Присоска изготовлена из качественной резины и имеет диаметр 116 мм. Длина самого инструмента составляет 620 мм.

Мы подошли к концу этого списка полезных товаров для автомобилей. Спасибо за чтение, надеюсь, вы узнали о новых товарах, которые упрощают жизнь автовладельца. Пожалуйста, не стесняйтесь делиться этой публикацией со своими друзьями и, пожалуйста, подумайте о том, чтобы рекомендовать ее. Вам не составит труда это сделать – автор будет рад.

  • Кстати, на канале Telegram TechnoReview интересные технологические устройства, новинки Xiaomi и скидки на них появляются еще быстрее, поэтому подписывайтесь, чтобы узнавать все первыми.
  • Для тех, кому не удобен Telegram, есть также подпаблик TechnoReview в VK, там много необычного снаряжения, новостей из мира технологий и техники, а также новинок от Xiaomi, так что подписывайтесь, чтобы не пропустить.

Желаю вам всем удачи и хорошего настроения. Пока.

ТОП 10 АВТОТОВАРОВ С ALIEXPRESS #5ТОП 10 АВТОТОВАРОВ С ALIEXPRESS #4ТОП 10 АВТОТОВАРОВ С ALIEXPRESS #3ТОП 10 АВТОТОВАРОВ С ALIEXPRESS #2ТОП 10 АВТОТОВАРОВ С ALIEXPRESS #1ТОП 50 АВТОТОВАРОВ С ALIEXPRESSТОП 18 АВТОТОВАРОВ С ALIEXPRESSТОП 10 АВТОТОВАРОВ С ALIEXPRESS

Подключение угла и код

Для каждого уровня был выбран свой цвет: нижний – зеленый, первый снизу – красный, второй – черный, третий – белый. Вначале макетная плата и светодиоды использовались для визуальной отладки.

На рисунке показана схема подключения. Подключите плюсовой провод к зеленому проводу, а остальные провода – к минусовому. Между проводами A0-A2 должен быть установлен резистор для устранения помех и короткого замыкания. Они выбраны просто для того, чтобы сохранить остальные порты.

Вместе с кодом есть комментарии. Используя функцию digitarRead(), опросите контакты. Напряжение заставит ее вернуть true. Далее проверьте, не находятся ли колеса в крайних положениях, которые препятствуют дальнейшему повороту в этом направлении.

Небольшой совет: поскольку выходы 5 В и 3,3 В понадобятся в будущем, вы можете поставить плюс на один из цифровых выводов. Перед каждым поворотом проверьте выходной ток через digitalWrite(whitePin), затем проверьте поворот и снимите ток.

int speedTurn = 180; //скорость поворота, от 0 до 255

//пины для определения поворота
int pinRed = A0;
int pinWhite = A1;
int pinBlack = A2;

int pinAngleStop = 12; //выводит ток на светодиод, если достигнут максимальный угол, нужен 
//только для отладки 

void setup() {
 //пины поворота на считывание
  pinMode(pinRed, INPUT);
  pinMode(pinBlack, INPUT);
  pinMode(pinWhite, INPUT);
//светодиод 
  pinMode(pinAngleStop, OUTPUT);
//пины драйвера двигателя, направление и скорость
  pinMode(angleDirection, OUTPUT);
  pinMode(angleSpeed, OUTPUT);

  Serial.begin(9600);
}
//функция вызывается из loop(), когда приходит команда с андроида
void turn(int angle) {
  digitalWrite(pinAngleStop, HIGH); //выдаем ток на провод, подключенный к плюсу
  delay(5); //немного ждем, чтобы ток "успел" дойти
  
  if(angle > 149) {
        if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinBlack) == LOW) { 
          //если достигнуто крайне правое положение, выйти из функции не подавая ток, чтобы не 
          //сжечь мотор
          return;
        }
        //если угол не максимальный, поворачиваем
        digitalWrite(angleDirection, HIGH);
        analogWrite(angleSpeed, speedTurn);
  } else if (angle < 31) { 
        if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) {
          //если достигнуто крайне левого положение, выйти из функции не подавая ток, чтобы не 
          //сжечь мотор
          return;
        }
        //если угол не максимальный, поворачиваем
        digitalWrite(angleDirection, LOW);
        analogWrite(angleSpeed, speedTurn);
  }
  digitalWrite(pinAngleStop, LOW); //убираем ток с определителя угла
  delay(5);
}

Практика вероятности: bluetooth против угонщиков

Какова вероятность того, что, выйдя из дома, вы столкнетесь с динозавром?

– Пятьдесят на пятьдесят! Вы либо делаете это, либо нет…

Когда проницательную блондинку из этого анекдота спросили о шансах вернуть угнанный автомобиль, она, скорее всего, ответила бы: либо найдут, либо нет. Если же автомобиль оснащен цифровым GPS, шансы могут быть иными.

Это называется “цифровая маркировка”. Именно так, в кавычках. Потому что эта технология не ассоциируется с царапинами (Litex, DataDot, VIN-антивирус, Krimistop, SABR,). знакомыми нашим автолюбителям. Роль маркера здесь выполняет миниатюрная Bluetooth-метка с индивидуальным цифровым “клеймом”, инструментом поиска является смартфон, а сеть, в которую должны попасть угонщики, создают волонтеры, вооруженные специальными поисковыми интернет-приложениями (Digital Marking, Magic Systems и Car-Online) – в Москве и Санкт-Петербурге их уже более 7000 пользователей.

Чем цифровой маркер отличается от GSM-маяков и других радиоустройств слежения? Передатчик Bluetooth в три-четыре раза меньше самого маленького радиомаяка, и его можно спрятать в автомобиле с большим успехом, чем иголку в стоге сена. Кроме того, организация радиоканала обеспечивает лучшую защиту от стандартных криминальных глушилок. При взломе автомобиля технически подкованные преступники использовали бы глушилку, направленную на диапазон 433/868/900 и 1800 МГц, используемый для пейджеров, систем сигнализации с двусторонней связью и различных GSM-пейджеров. Для блокирования участка спектра, предназначенного для передатчиков Bluetooth, потребуется оборудование, настроенное на более высокие частоты (2400 МГц). Полной защиты от радиоэлектронного подавления не существует, но она может служить в качестве хитрости.

Как подключить телефон к машине через Bluetooth: шаг за шагом

Маркер выглядит как транспондерный ключ от бесконтактного иммобилайзера и представляет собой передатчик Bluetooth с индивидуальным номером, работающий по энергосберегающему протоколу

У “синезубой” метки нет никаких органов управления. После подключения батареи к интернет-приложению метка мгновенно становится активной и благодаря энергосберегающему протоколу Bluetooth LE (low energy) работает не менее полутора лет без замены батареи. Она должна быть видна смартфону на расстоянии пятидесяти метров (приложение отображает расстояние и направление), а наличие контакта свидетельствует о том, что канал связи функционирует.

После того, как владелец автомобиля объявит его в угон (для этого достаточно одного щелчка на онлайн-приложении), онлайн-программа делает маркер “угнанный” видимым для всех смартфонов с поисковой программой. По сути, любой человек, на чьем телефоне установлено поисковое приложение и включен Bluetooth, автоматически начинает искать угнанный автомобиль. Как только смартфон приблизится к нему в пределах радиовидимости (те самые 50 метров), он тут же получит push-уведомление (оно всплывает поверх всех открытых программ), “визитную карточку” автомобиля (марка, модель, цвет, номер), направление и расстояние до него. Более того, программа также запросит разрешение на передачу информации на сервер провайдера.

Роботизированная машина. часть iii: bluetooth

С точки зрения программирования и управления через Bluetooth эта статья особенно интересна. В предыдущей статье подробно обсуждаются вопросы сборки.

Начните с присоединения модуля связи HC-06 Bluetooth к роботу. HC-06 следует настроить заранее. Хотя можно использовать HC-05, его функциональность будет излишней для данной задачи, а сам модуль стоит дороже.

Следующий шаг – установить на телефон бесплатное приложение Bluetooth RC Controller. Имитируя основные кнопки пульта дистанционного управления, программа передает команды по Bluetooth в текстовом формате.

Как подключить телефон к машине через Bluetooth: шаг за шагом

Вы можете видеть, что интерфейс программы очень интуитивно понятен. В левом верхнем углу интерфейса находится индикатор подключения модуля HC-06 (зеленый цвет означает, что соединение установлено). Здесь же находится компас, который показывает выбранное направление движения, а также элементы управления по периметру. Почти все было решено использовать для нашего автомобиля. Перечисляем слева направо.

В этих условиях почти все кнопки на пульте дистанционного управления были напрямую сопоставлены с существующими командами на машине. Однако код управления скоростью пришлось писать и отлаживать отдельно. Диагональные направления также оказались нетривиальными. Они реализованы через разницу скоростей на левой и правой стороне.

Программа прошивки показана ниже. Опрос сонара в моей версии отключен, но его можно восстановить. Удивительно, но опция остановки возле препятствия показалась мне невыносимой при ручном управлении.

*

// 4WD RoboCar
// Sonar   Bluetooth
// 2023-January-20
// v.11a (bluetooth)
// (c) 2023, Vladimir E. DRACH

// Global variables:
int  Critical = 14;     // Критическое расстояние до препятствия в [см]
int  BT_Step  = 10;     // Время движения при получении одного СИМВОЛА по BT [мс]
byte randomNumber;      // Случайное число
byte Cost = 60;         // Штраф (назначается за неспособность ехать вперёд)
byte Profit = 180;      // Очки, т.е. "прибыль", которая плавно растёт при движении вперёд
byte velocity = 220;    // Скорость моторов [1..255]
                            // Подобрать экспериментально:
const byte SPEED_MIN = 100; // минимальная скорость моторов, если меньше - моторы не смогут вращаться
const byte SPEED_MAX = 250; // максимальная скорость моторов

// для управления по Bluetooth
char btCommand = 'S';
// счетчики для определения потери связи с Bluetooth
unsigned long btTimer0 = 2000;  //Stores the time (in millis since execution started)
unsigned long btTimer1 = 0;     //Stores the time when the last command was received from the phone

// Описываем подключение драйвера двигателей
// A - правый борт
// В -  левый борт

int enableB = 3; //~ 
int pinB2   = 4; // 
int pinB1   = 5; // 
int enableA = 6; //~ 
int pinA1   = 7; //~ 
int pinA2   = 8; //

#define illumination A0 // подключаем составной светодиод

// Подключаем ультразвуковой датчик
#define trigPin 9
#define echoPin 10

#define light 11 // На этот вывод подключены фары

int Buzzer = 12;// Подключаем зуммер 12 (!)

// Фоторезистор подключен к АЦП
#define PHOTO_SENSOR A5

#define Sweep 8000 // скорость нарастания и убывания частоты
#define Woo_wait_sec 2 // сколько с. длится гудение на макс. частоте

void setup() {
  // Определяем направление работы линий
   pinMode (enableA, OUTPUT);
   pinMode (pinA1,   OUTPUT);
   pinMode (pinA2,   OUTPUT);
   pinMode (enableB, OUTPUT);
   pinMode (pinB1,   OUTPUT);
   pinMode (pinB2,   OUTPUT); 
   pinMode (13 ,     OUTPUT);
   pinMode (light ,  OUTPUT);
   pinMode (trigPin, OUTPUT);
   pinMode (echoPin, INPUT) ;
   pinMode (illumination, OUTPUT);
 enableMotors();
 SayBeep();
 delay(2000);
 bii();
 digitalWrite(13,  LOW);    // Выключаем встроенный диод
 Serial.begin(9600);        // Инициализация последовательного порта
}

// Описываем варианты работы моторов
void motorAforward() {
 digitalWrite (pinA1, HIGH);
 digitalWrite (pinA2, LOW);
}
void motorBforward() {
 digitalWrite (pinB1, LOW);
 digitalWrite (pinB2, HIGH);
}
void motorAbackward() {
 digitalWrite (pinA1, LOW);
 digitalWrite (pinA2, HIGH);
}
void motorBbackward() {
 digitalWrite (pinB1, HIGH);
 digitalWrite (pinB2, LOW);
}
void motorAstop() {
 digitalWrite (pinA1, HIGH);
 digitalWrite (pinA2, HIGH);
}
void motorBstop() {
 digitalWrite (pinB1, HIGH);
 digitalWrite (pinB2, HIGH);
}
void motorAon() {
 digitalWrite (enableA, HIGH);
}
void motorBon() {
 digitalWrite (enableB, HIGH);
}
void motorAoff() {
 digitalWrite (enableA, LOW);
}
void motorBoff() {
 digitalWrite (enableB, LOW);
}

// Описываем варианты движения машины
void goForward (int duration) {
 motorAforward();
 motorBforward();
 delay (duration);
}
void goBackward (int duration) {
 motorAbackward();
 motorBbackward();
 delay (duration);
}
void rotateRight (int duration) {
 motorAbackward();
 motorBforward();
 delay (duration);
}
void rotateLeft (int duration) {
 motorAforward();
 motorBbackward();
 delay (duration);
}
void FullStop (int duration) {
 motorAstop();
 motorBstop();
 delay (duration);
}
void disableMotors() {
 motorAoff();
 motorBoff();
}
void enableMotors() {
 motorAon();
 motorBon(); 
 // SetVelocity(SPEED_MAX, SPEED_MAX); не очень работает :(
}

void SetVelocity(int A, int B)
{         analogWrite (enableA, A);
          analogWrite (enableB, B); }

void CheckLight () {
  int val = analogRead(PHOTO_SENSOR);
  if (val < 500) {
    // Темновато, включаем фары
    digitalWrite(light, HIGH);
   } else {
    // Светло, выключаем фары
    digitalWrite(light,  LOW);
   }
}

// Пользуемся УЗ датчиком расстояния
int distance() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1; // Переводим в сантиметры
  return distance;
}

// Функция запуска автомобиля
void launch() {
     int distance_measured;
     distance_measured = distance();
      // Serial.print(distance_0);
      // Serial.println(" сантиметров. ");
     SetVelocity (velocity, velocity);
      // Движемся вперёд, пока расстояние до преграды > критического [cm]
     while (distance_measured > Critical)
     {
     CheckLight ();  // проверяем, не пора ли зажигать фары?
     goForward(30); // Едем вперёд некоторое время
     randomNumber = random(1,100); // передёрнули затвор генератора ПСЧ
     if (Profit < 254 ) { Profit  ; };
     // Serial.print(Profit);
     // Serial.println(" очков. ");
     distance_measured = distance();
     }
     FullStop(100); // Останов, т.к. впереди помеха
}

void Woo(int freq, long duration){ // первый параметр частота, чем ниже он тем выше частота, второй длительность
  long time = duration/2/freq;
  for(long t = 0; t < time; t  )
  { digitalWrite(Buzzer, HIGH);
    delayMicroseconds(freq);
    digitalWrite(Buzzer, LOW);
    delayMicroseconds(freq); }
}

void Syren() {
    for(int i = 0; i <= 1; i  ){         // делаем виу-виу 2 раза
    for(int f = 2000; f >= 100; f=f-40){ // нарастание частоты
    Woo(f, Sweep); }
    // Woo(400, Woo_wait_sec*100);    // сколько длится гудение на максимальной частоте
    for(int f = 100; f <= 2000; f=f 40){ // убывание частоты
    Woo(f, Sweep); }
    }
    }

void panic() {
 int distance_tmp;
 int distance_new = 32000;
 int angle = 600;  // угол поворота, измеряем в [мс]
    FullStop(100); // Сначала останавливаемся
    Profit = 255;  // Забываем про старые штрафы!
    // Serial.print(Profit);
    // Serial.println(" очков. ");
    digitalWrite(illumination, HIGH); // включаем мигалку
    Syren ();
    Syren ();
    Syren ();
    delay(1000);  // пауза, для отдыха
    // Выполняем манёвры на высокой скорости (ведь паника!)
    analogWrite (enableA, velocity);
    analogWrite (enableB, velocity);
    // 0) Начинаем крутиться волчком в какую-то сторону:
    randomNumber = random(1,100);
    if (randomNumber < 50) { motorAbackward(); motorBforward(); }
                      else { motorBbackward(); motorAforward(); };
    // Истерично продолжаем крутиться, пока гудит сирена:
    Syren ();
    delay (1000); // Ждём 
    FullStop(1000);
    delay (100); // Ждём 
    // 1) Ищем хоть какое-то направление, куда вообще можно ехать
    distance_tmp = distance();
    do {
     rotateRight(angle); // Крутимся
     FullStop(1000); // Ждём и смотрим вдаль
     distance_tmp = distance();
     } while(distance_tmp < Critical); // повторяем поворот, если расстояние всё ещё мало

     SayBeep();
     // rotateLeft(angle); // Возвращаемся на один шаг
 
    // 2) Пытаемся выбрать лучшее направление!
     
    do {
    distance_tmp = distance();
    rotateRight(angle); // Крутимся и проверяем дистанцию
    FullStop(900); // Ждём и смотрим вдаль
    distance_new = distance();
    delay (800); // Ждём и смотрим вдаль
    } while( distance_new > distance_tmp );
                                   // Не угадали, раньше было лучше,
    rotateLeft(angle);             // поэтому поворачиваемся обратно
    FullStop(1000); // Восстанавливаем дыхание, успокаиваемся
    digitalWrite(illumination, LOW); // успокоились, выключаем мигалку
    delay (410); // Ждём
    SayBeep();
    }

void rollBack()
    {
    digitalWrite(13,  HIGH); // Включаем встроенный диод!
    // Сначала откатываемся назад на случайное количество шагов
    randomNumber = random(700,2100);
    //analogWrite (enableA, 150);
    //analogWrite (enableB, 189);
    goBackward(randomNumber);
    FullStop(200); // Восстанавливаем дыхание, успокаиваемся
        
    // Случайным образом выбираем направление поворота:
    randomNumber = random(1,100);
       
     do { // поворачиваемся в выбранную сторону на случайный угол
     if (randomNumber < 50) { rotateRight(random(450,1300)); } else { rotateLeft(random(350,1400)); };
     FullStop(1000); // Выключаем моторы
     tone(Buzzer, 600, 333);
     delay (700); // передышка!
     } while( distance() < Critical ); // повторяем поворот, если расстояние всё ещё мало

    analogWrite (enableA, velocity);
    analogWrite (enableB, velocity);
    FullStop(600); // Восстанавливаем дыхание, успокаиваемся
    digitalWrite(13,  LOW); // Выключаем встроенный диод
    // SayBeep();
    delay (200); // передышка!
    } 

void avoid() {
    CheckLight ();  // проверяем, не пора ли зажигать фары?
    tone(Buzzer, 2100, 110);
    delay (700); // передышка!
    // Штрафуем сами себя:
    if (Profit > Cost) {
    Profit = Profit - Cost; // Ещё есть возможность оплатить штраф,
    rollBack();             // тогда откат назад с разворотом
     // Serial.print(Profit);
     // Serial.println(" очков. ");
    } else {
    // Нельзя штрафовать, всё плохо, значит запутались - паникуем
    panic();
    }
}

void SayBeep(){
    tone(Buzzer, 700, 109);
    delay(200);
    tone(Buzzer, 1200, 109);
    delay(200);
    tone(Buzzer, 2600, 240);
    delay(350);
    noTone(Buzzer);
}

void boo(){
      tone(Buzzer, 600, 200);
      delay (300);
      tone(Buzzer, 410, 600);
      delay (600);
}

void bii(){
      tone(Buzzer, 1611, 90);
      delay (150);
      tone(Buzzer, 1611, 90);
      delay (150);
      tone(Buzzer, 2111, 400);
      delay (440);
}

void SafeForward (int duration){
  int distance_measured;
  distance_measured = distance();
  if ( distance_measured > Critical )
      {goForward(duration);}
      else {
      FullStop(10);
      boo(); }
}

void BluetoothControl() {
     for(int i = 0; i <= 4; i  ){
     // digitalWrite(illumination, HIGH); // включаем мигалку
     digitalWrite(13,  HIGH); // Включаем встроенный диод!
     FullStop(80);
     // digitalWrite(illumination, LOW); // вЫключаем мигалку
     digitalWrite(13,  LOW); // Включаем встроенный диод!
     FullStop(900);
     velocity = SPEED_MIN   10;         // Выставлям скорость поменьше, т.к.
     SetVelocity(velocity, velocity);   // на Android будет миниальная скорость по умолчанию!
     }
     do{
     // CheckLight ();  // проверяем, не пора ли зажигать фары?
     aquire();
     }
     while ( 1==1 );
}

void SelfControl() {
     do{
     randomNumber = random(2,5); // вхолостую выбираем псевдо-случайное число
     launch(); // запускаем автомобиль вперёд до встречи с преградой
     avoid();  // откатываемся от препятствия и как-то поворачиваемся
     CheckLight (); // проверяем, не пора ли зажигать фары?
     }
     while ( 1==1 );
}

void aquire ()
{
  if (Serial.available() > 0) {
    btTimer1 = millis();
    btCommand = Serial.read();
    switch (btCommand){
    case 'F':
      goForward(BT_Step); // Можно просто ехать вперёд наобум,
      // SafeForward (BT_Step); // а можно включить сонар
      break;
    case 'B':
      goBackward(BT_Step);
      break;
    case 'L':
      rotateLeft(BT_Step);
      break;
    case 'R':
      rotateRight(BT_Step);
      break;
    case 'S':
      FullStop(BT_Step);
      break;
    case 'G':  // Вперёд, подкручивая вправо
      if (velocity < SPEED_MAX-99) {
      SetVelocity((velocity 99), (velocity-99));}
      else {SetVelocity(SPEED_MAX, SPEED_MIN);} // выставили дифференциал
      goForward (BT_Step);
      SetVelocity(velocity, velocity); // вернули скорость
      break;
    case 'I':  // Вперёд, подкручивая влево
      if (velocity < SPEED_MAX-99) {
      SetVelocity((velocity-99), (velocity 99));}
      else {SetVelocity(SPEED_MIN,SPEED_MAX);} // выставили дифференциал
      goForward (BT_Step);
      SetVelocity(velocity, velocity); // вернули скорость
      break;
    /*case 'J':  //BR
      if (velocity < SPEED_MAX-80) {
      SetVelocity((velocity-80), (velocity 80));}
      else {SetVelocity((velocity-80),SPEED_MAX);} // выставили дифференциал
      goBackward(BT_Step);
      SetVelocity(velocity, velocity); // вернули скорость
      break;
    case 'H':  //BL
      if (velocity < SPEED_MAX-80) {
      SetVelocity((velocity 80), (velocity-80));}
      else {SetVelocity(SPEED_MAX, (velocity-80));} // выставили дифференциал
      goBackward(BT_Step);
      SetVelocity(velocity, velocity); // вернули скорость
      break;
      */
    case 'W':  //  Зажгли фары
      digitalWrite(light, HIGH);
      break;
   case 'w':  // Погасили фары
      digitalWrite(light, LOW);
      break;
   case 'D':  // Everything OFF
      FullStop(100);
      break;
   case 'X': // аварийка
      digitalWrite(illumination, HIGH);
      break;
   case 'x': // аварийка
      digitalWrite(illumination, LOW);
      break;      
   case 'U':  // Back ON
      digitalWrite(13,  HIGH);  // Включаем встроенный диод
      break;
   case 'u':  // Back OFF
      digitalWrite(13,  LOW);    // Выключаем встроенный диод
      break;
   case 'V': // Пискнуть весело (в оригинале - гудок ВКЛ)
      bii();
      break;
   case 'v': // Пискнуть грустно (в оригинале (гудок ВЫКЛ)
      boo();
      break; 
   default:  // Get SPEED_CURRENT
      if ( btCommand == 'q' ){
         velocity = SPEED_MAX;
         SetVelocity(velocity, velocity);
         } else {
        // Символы '0' - '9' эквивалентны кодам integer 48 - 57 соответственно
        if ( (btCommand >= 48) && (btCommand <= 57) ) {
          // Subtracting 48 changes the range from 48-57 to 0-9.
          // Multiplying by 25 changes the range from 0-9 to 0-225.
          velocity = SPEED_MIN   (btCommand - 48) * 15;
          SetVelocity(velocity, velocity);
        }
      } // else
    } // switch
  } // if (Serial.available() > 0)
  else {
    btTimer0 = millis();  // Узнаём текущее время (millis since execution started)
    //Check if it has been 500ms since we received last btCommand.
    if ((btTimer0 - btTimer1) > 800)   {
      //More than 800 ms have passed since last btCommand received, car is out of range.
      FullStop(1000);
      digitalWrite(illumination, HIGH); // включаем мигалку
      boo ();
      FullStop(4000);
      Syren();
      FullStop(8000);
    }
  }
}

void loop() {
     CheckLight ();  // проверяем, не пора ли зажигать фары?
     // Serial.println("System ready...");
     if ( distance() > Critical )
        {                     // Путь вперёд свободен,
          SelfControl();      // робот отправляется в самостоятельное путешествие
        } else {
          BluetoothControl(); // Впереди преграда, отдаём управление водителю
        }
     }

*

Проверяя расстояние до препятствия, изначально выбирается режим (ручной или демонстрационный). При включении машина стоит лицом к стене – ручное управление через Bluetooth. При запуске перед машиной нет препятствий – самостоятельное движение (демонстрационный режим).

§

Корпусом для устройства послужила коробка из-под конфет. Оно построено с помощью модуля микроконтроллера Arduino UNO, который управляет трехцветным (сверхъярким) светодиодом. Помимо батареек типа АА, был также футляр для батареек типа АА, а батарейки от радиоуправляемой машинки отлично подошли для переработки.

Как подключить телефон к машине через Bluetooth: шаг за шагом

Неожиданно у меня возникла идея, но есть ли способ дополнительно управлять лампой? Увидев миниатюрный джойстик, я был заинтригован. Это именно то, что нам нужно!

Так, светильник плавно меняет цвета с красного на зелено-синий, но при нажатии на кнопку джойстика переходит в режим ручного управления (в котором уровень яркости каждого цвета определяется положением ручки джойстика). Для выхода из ручного режима необходимо снова нажать кнопку.

Как подключить телефон к машине через Bluetooth: шаг за шагом

Как подключить телефон к машине через Bluetooth: шаг за шагом

Текст программы был первоначально заимствован из открытых источников, но затем сильно изменен. В результате ночник стал более мягким и нежным.

const int pinRed    = 11;
const int pinGreen  =  9;
const int pinBlue   = 10;
const int swPin     = A5; 
const int pinX      = A4; // X 
const int pinY      = A3; // Y 
const int ledPin    = 13;
boolean ledOn  = false; // текущее состояние кнопки
boolean prevSw = false; // предыдущее состояние кнопки

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(pinRed, OUTPUT);
  pinMode(pinGreen, OUTPUT);
  pinMode(pinBlue, OUTPUT);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(swPin, INPUT);  
  digitalWrite(swPin, HIGH); // включаем встроенный подтягивающий резистор
}

boolean isLedOn() { // ОПРЕДЕЛЯЕМ НАЖАТИЕ КНОПКИ
  if (digitalRead(swPin) == HIGH && prevSw == LOW) {
    ledOn = !ledOn;
    prevSw = HIGH;
  }
  else  prevSw = digitalRead(swPin); 
  digitalWrite(ledPin, ledOn); // включаем светодиод на пине 13
  return ledOn;
}

void CtlMode() { // РЕЖИМ "Ручное управление"
  int X = analogRead(pinX); // считываем положение джойстика
  int Y = analogRead(pinY);
  int BLUE  = map(Y, 000, 1023, 0, 255); // маппинг значений
  int GREEN = map(X, 512, 1023, 0, 255);
  int RED   = map(X, 511, 0, 0, 255);
  analogWrite(pinRed, RED);     // включение каналов R,G,B
  analogWrite(pinGreen, GREEN);
  analogWrite(pinBlue, BLUE);
}

void DemoMode() { // РЕЖИМ "Демонстрация"
    for (int i=0; i <= 255; i  ) {
      if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла
      analogWrite(pinRed, i); // работает канал RED
      analogWrite(pinGreen, 0);
      analogWrite(pinBlue, 0);  
      delay(7);
    }
    for (int i=255; i >= 0; i--) {
      if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла
      analogWrite(pinRed, i);   // работает канал RED
      analogWrite(pinGreen, 0);
      analogWrite(pinBlue, 0);  
      delay(7);
    }
    for (int i=0; i <= 255; i  ) {
      if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла
      analogWrite(pinRed, 0);
      analogWrite(pinGreen, 0);
      analogWrite(pinBlue, i);  // работает канал BLUE
      delay(7);
    }
    for (int i=255; i >= 0; i--) {
      if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла
      analogWrite(pinRed, 0);
      analogWrite(pinGreen, 0);
      analogWrite(pinBlue, i);  // работает канал BLUE
      delay(7);
    }
    for (int i=0; i <= 255; i  ) {
      if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла
      analogWrite(pinRed, 0);
      analogWrite(pinGreen, i); // работает канал GREEN
      analogWrite(pinBlue, 0);  
      delay(7);
    }
    for (int i=255; i >= 0; i--) {
      if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла
      analogWrite(pinRed, 0);
      analogWrite(pinGreen, i); // работает канал GREEN
      analogWrite(pinBlue, 0);  
      delay(7);
    }
}

void loop() { // если нажата кнопка и горит светодиод на пине 13, включаем режим "Ручое управление"
  if (isLedOn()) CtlMode(); 
  else DemoMode(); // иначе включаем демонстрационный режим
}


Когда все было проверено на рабочем столе, пришло время встроить его в квартиру. Его разместили в нише так, чтобы световой поток падал на стену, тогда комната освещается только отраженным светом. Несмотря на избыток, ночью яркость вполне достаточная. Провода от коробки до диода были удлинены, так что теперь джойстик можно поставить на прикроватную тумбочку.

§

Серво акселерометр

При необходимости измерения наклона акселерометр ADXL345 отлично подходит для измерения статического ускорения свободного падения вследствие наклона, а также может использоваться для измерения динамического ускорения вследствие движения. Высокое разрешение (4 mg/LSB) позволяет измерять изменения наклона менее 1 градуса.

Сборка устройства осуществляется следующим образом. Используя шину I2C или SPI, акселерометр ADXL345 посылает информацию о положении в микроконтроллерный модуль через диапазон -16g и 13-битное разрешение. Используя специальную функцию atan2, микроконтроллер принимает данные акселерометра и декодирует их.

После этого генерируется управляющее воздействие на серводвигатель. Для серводвигателей нет библиотек, что является важной особенностью.

Ниже представлен тестовый листинг программы.

/*
  Подключение акселерометра по шине I2C:
  VCC: 5V
  GND: ground
  SCL: UNO SCL (А5?)
  SDA: UNO SDA (А4?)
*/

#include <Servo.h>
Servo motor; // Определяем имя серво-привода
#include <Math.h> // Вроде, нужна для atan2
#include <Wire.h>
// Registers for ADXL345
#define ADXL345_ADDRESS (0xA6 >> 1)  // address for device is 8 bit but shift to the
// right by 1 bit to make it 7 bit because the
// wire library only takes in 7 bit addresses
#define ADXL345_REGISTER_XLSB (0x32)

float Angle;      // угол поворота мотора
float prev_Angle; // временная переменная для угла
float value; // промежуточное значение Y

int accelerometer_data[3];
// void because this only tells the chip to send data to its output register
// writes data to the slave's buffer
void i2c_write(int address, byte reg, byte data) {
  // Send output register address
  Wire.beginTransmission(address);
  // Connect to device
  Wire.write(reg);
  // Send data
  Wire.write(data); //low byte
  Wire.endTransmission();
}

// void because using pointers
// microcontroller reads data from the sensor's input register
void i2c_read(int address, byte reg, int count, byte* data) {
  // Used to read the number of data received
  int i = 0;
  // Send input register address
  Wire.beginTransmission(address);
  // Connect to device
  Wire.write(reg);
  Wire.endTransmission();
  // Connect to device
  Wire.beginTransmission(address);
  // Request data from slave
  // Count stands for number of bytes to request
  Wire.requestFrom(address, count);
  while (Wire.available()) // slave may send less than requested
  {
    char c = Wire.read(); // receive a byte as character
    data[i] = c;
    i  ;
  }
  Wire.endTransmission();
}

void init_adxl345() {
  byte data = 0;
  i2c_write(ADXL345_ADDRESS, 0x31, 0x0B);   // 13-bit mode   - 16g
  i2c_write(ADXL345_ADDRESS, 0x2D, 0x08);   // Power register
  i2c_write(ADXL345_ADDRESS, 0x1E, 0x00);   // X
  i2c_write(ADXL345_ADDRESS, 0x1F, 0x00);   // Y
  i2c_write(ADXL345_ADDRESS, 0x20, 0x05);   // Z
  // Проверка работоспособности
  i2c_read(ADXL345_ADDRESS, 0X00, 1, &data);
  if (data == 0xE5)
    Serial.println("It works well!");
  else
    Serial.println("Failure... :(");
}

void read_adxl345() {
  byte bytes[6];
  memset(bytes, 0, 6);
  // Чтение шести байтов из ADXL345
  i2c_read(ADXL345_ADDRESS, ADXL345_REGISTER_XLSB, 6, bytes);
  // Распаковка данных
  for (int i = 0; i < 3;   i) {
    accelerometer_data[i] = (int)bytes[2 * i]   (((int)bytes[2 * i   1]) << 8);
  }
}

void setup() {
  motor.attach(9); // Прицепили серво-мотор (9 or 10)
  Wire.begin();
  Serial.begin(9600);
  for (int i = 0; i < 3;   i)   {
    accelerometer_data[i]  = 0;
  }
  init_adxl345();
}

void react() {
  // Теперь посылаем данные в мотор
  // Angle = map(value, 0, 1.0, 0, 180); // диапазон акселерометра отображается на 0..180 или 0..20 градусов
  Angle = value * 180.0;
  // Angle = constrain(Angle, 1, 180); // ограничиваем значения диапазоном от 1 до 180

  Serial.print("t");
  Serial.print("Угол: ");
  Serial.print(Angle);
  Serial.println("t");
  if (Angle != prev_Angle)
  {
    motor.write(Angle); // установить угол поворота мотора
    prev_Angle = Angle; // запомнить текущий угол
  }
}

void loop() {
  read_adxl345();
  Serial.print("ACCEL: ");
  Serial.print(float(accelerometer_data[0]) * 3.9 / 1000); // 3.9mg/LSB scale factor in 13-bit mode
  Serial.print("t");
  Serial.print(float(accelerometer_data[1]) * 3.9 / 1000);
  Serial.print("t");
  Serial.print(float(accelerometer_data[2]) * 3.9 / 1000);
  Serial.print("n");

  // value = float((accelerometer_data[1]) * 3.9 / 1000);

  value = atan2(float((accelerometer_data[1]) * 3.9 / 1000), float((accelerometer_data[0]) * 3.9 / 1000));
  if ( (value > 0) && (value < 1.0)) {
    react ();
   }
  delay(100);
}


§

Типовые характеристики дисплея следующие
Display Capacity: 16 × 2 characters.
Chip Operating Voltage: 4.5 ~ 5.5V.
Working Current: 2.0mA (5.0V).
Optimum working voltage of the module is 5.0V.
Character Size: 2.95 * 4.35 (W * H) mm.

Как показано на схеме, модули микроконтроллеров Arduino Uno и Mega 2560 соединены между собой.

 

 

Листинг программы для тестов может использоваться следующим образом

/* __________________
   1602 LCD 8-bit bus control
   __________________ */

int DI = 12;
int RW = 11;
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10}; // use array to select pin for bus
int Enable = 2;

void LcdCommandWrite(int value) {
  // define all pins
  int i = 0;
  for (i = DB[0]; i <= DI; i  ) // assign value for bus
  {
    digitalWrite(i, value & 01); // for 1602 LCD, it uses D7-D0( not D0-D7) for signal identification; here, itΓÇÖs used for signal inversion.
    value >>= 1;
  }
  digitalWrite(Enable, LOW);
  delayMicroseconds(1);
  digitalWrite(Enable, HIGH);
  delayMicroseconds(1);  // wait for 1ms
  digitalWrite(Enable, LOW);
  delayMicroseconds(1);  // wait for 1ms
}

void LcdDataWrite(int value) {
  // initialize all pins
  int i = 0;
  digitalWrite(DI, HIGH);
  digitalWrite(RW, LOW);
  for (i = DB[0]; i <= DB[7]; i  ) {
    digitalWrite(i, value & 01);
    value >>= 1;
  }
  digitalWrite(Enable, LOW);
  delayMicroseconds(1);
  digitalWrite(Enable, HIGH);
  delayMicroseconds(1);
  digitalWrite(Enable, LOW);
  delayMicroseconds(1);  // wait for 1ms
}

void setup (void) {
  int i = 0;
  for (i = Enable; i <= DI; i  ) {
    pinMode(i, OUTPUT);
  }
  delay(100);
  // initialize LCD after a brief pause
  // for LCD control
  LcdCommandWrite(0x38);  // select as 8-bit interface, 2-line display, 5x7 character size
  delay(64);
  LcdCommandWrite(0x38);  // select as 8-bit interface, 2-line display, 5x7 character size
  delay(50);
  LcdCommandWrite(0x38);  // select as 8-bit interface, 2-line display, 5x7 character size
  delay(20);
  LcdCommandWrite(0x06);  // set input mode
  // auto-increment, no display of shifting
  delay(20);
  LcdCommandWrite(0x0E);  // display setup
  // turn on the monitor, cursor on, no flickering
  delay(20);
  LcdCommandWrite(0x01);  // clear the scree, cursor position returns to 0
  delay(100);
  LcdCommandWrite(0x80);  //  display setup
  //  turn on the monitor, cursor on, no flickering
  delay(20);
}

void loop (void) {
  LcdCommandWrite(0x01);  // clear the screen, cursor position returns to 0
  delay(10);
  LcdCommandWrite(0x80   3);
  delay(10);
  // Show welcome message
  LcdDataWrite('W');
  LcdDataWrite('e');
  LcdDataWrite('l');
  LcdDataWrite('c');
  LcdDataWrite('o');
  LcdDataWrite('m');
  LcdDataWrite('e');
  LcdDataWrite(' ');
  LcdDataWrite('t');
  LcdDataWrite('o');
  delay(10);
  LcdCommandWrite(0xc0   1); // set cursor position at second line, second position
  delay(10);
  LcdDataWrite('M');
  LcdDataWrite('G');
  LcdDataWrite('T');
  LcdDataWrite('U');
  LcdDataWrite('-');
  LcdDataWrite('w');
  LcdDataWrite('o');
  LcdDataWrite('r');
  LcdDataWrite('k');
  LcdDataWrite('s');
  LcdDataWrite('h');
  LcdDataWrite('o');
  LcdDataWrite('p');
  delay(3300);
  LcdCommandWrite(0x01);  // clear the screen, cursor returns to 0
  delay(10);
  LcdDataWrite('I');
  LcdDataWrite(' ');
  LcdDataWrite('a');
  LcdDataWrite('m');
  LcdDataWrite(' ');
  LcdDataWrite('a');
  LcdDataWrite(' ');
  LcdDataWrite('b');
  LcdDataWrite('o');
  LcdDataWrite('s');
  LcdDataWrite('s');
  delay(3000);
  LcdCommandWrite(0x02); // set mode as new characters replace old ones, where there is no new ones remain the same
  delay(10);
  LcdCommandWrite(0x80   5); // set cursor position at first line, sixth position
  delay(10);

  LcdDataWrite('V');
  LcdDataWrite('.');
  delay(220);
  LcdDataWrite('E');
  delay(220);
  LcdDataWrite('.');
  delay(220);
  LcdDataWrite(' ');
  LcdDataWrite('D');
  delay(220);
  LcdDataWrite('r');
  delay(220);
  LcdDataWrite('a');
  delay(220);
  LcdDataWrite('c');
  delay(220);
  LcdDataWrite('h');
  delay(5000);
}

После прошивки мы видим, что на дисплее отображается текст

 

В результате, мы видим пример жидкокристаллического дисплея

Как подключить телефон к машине через Bluetooth: шаг за шагом

Использование микроконтроллера или модуля микроконтроллера для реализации этого решения является чрезвычайно ресурсоемким. Для уменьшения использования выводов рекомендуется использовать 4-битную шину.

Технология bluetooth в автомобиле

Мы живем в эпоху цифровых технологий и беспроводного подключения. На ПК больше нет необходимости в проводном соединении между мышью и клавиатурой. С помощью Bluetooth смартфоны можно подключать к наушникам и беспроводным колонкам.

Технология Bluetooth в автомобиле

И автомобильные разработки не стоят на месте. Большинство современных автомобилей оснащены Bluetooth, что означает, что вы можете легко сопрячь свой смартфон с автомобилем и слушать музыку из библиотеки вашего телефона через динамики автомобиля.

При сопряжении устройств Bluetooth сохраняются данные для связи между устройствами. Два устройства регистрируют данные и подключаются. Вы можете совместно использовать устройства Bluetooth путем сопряжения одного устройства (в данном случае телефона) с другим (в данном случае автомобилем). Радиус действия Bluetooth составляет 10-15 метров. Поскольку в смартфоне будет включен Bluetooth, а в автомобиле – Bluetooth после сопряжения, два устройства автоматически соединятся, когда вы перейдете из квартиры в машину. Когда вы будете находиться в машине, вам больше не нужно будет выполнять никаких операций. Оба устройства сохраняют в своей памяти данные, необходимые для последующего быстрого подключения. Чтобы сделать вождение более удобным, можно использовать автомобильный держатель для смартфона, который крепится к лобовому стеклу с помощью присоски. Ваш смартфон можно вставить в держатель. Установите смартфон в удобном для вас месте, и вы будете готовы к поездке.

Технология Bluetooth в автомобиле 3

Как подключиться? Очень просто. В настройках оборудования автомобиля должен быть активирован Bluetooth, а на смартфоне необходимо выполнить поиск Bluetooth-оборудования. Выберите из списка устройство, название которого более похоже на марку автомобиля. Есть вероятность, что при сопряжении смартфон запросит у тебя пароль, чаще всего что-то простое вроде “1234” или “0000”.

Прослушивание музыки со смартфона – не предел. Большинство современных смартфонов имеют модуль GPS или ГЛОНАСС, и, установив приложение “Яндекс Навигатор”, вы можете спокойно путешествовать, слушая подсказки через акустику.

При получении телефонного звонка нет необходимости держаться одной рукой за рулевое колесо, брать телефон в руку и нарушать правила дорожного движения. Используя динамики автомобиля, ваш смартфон может легко принимать звонки в режиме “свободные руки”. В моделях автомобилей автоответчик обычно располагается на рулевом колесе. Не отчаивайтесь, если на вашем рулевом колесе нет такой кнопки, ведь современные смартфоны также имеют голосовое управление, поэтому вы можете просто сказать “возьми трубку”, чтобы ответить на звонок. С помощью голосового помощника вы также можете управлять телефоном, не прикасаясь к нему.

Не беда, если в вашем автомобиле нет интерфейса Bluetooth, но есть интерфейс AUX. Вы можете приобрести адаптер, который преобразует Bluetooth в AUX. С помощью этого адаптера любое устройство с поддержкой Bluetooth (или любое другое устройство) может общаться через AUX с помощью Bluetooth. Вы можете делать все вышеперечисленное со своим смартфоном и автомобилем с помощью такого устройства, которое стоит не дорого.

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

Смотрите про коптеры:  Квадроциклы Can-Am от BRP: купить, цены. Модельный ряд квадроциклов БРП Кан-Ам – FORMULA 7
Оцените статью
Радиокоптер.ру
Добавить комментарий