После чего необходимо дождатся завершения проверки правильности записанных данных на флеш карту.
После чего необходимо дождатся завершения проверки правильности записанных данных на флеш карту.
![raspb3]pic/(raspb/rasp3.png)
![raspb3](pic/raspb/rasp3.png)
![raspb4](pic/raspb/rasp4.png)
![raspb4](pic/raspb/rasp4.png)
4. Для того, чтобы избавиться от необходимости работать с Raspberry Pi, подключая к ней монитор, клавиатуру и мышку, мы будем использовать подключение с удаленного компьютера по ssh. Для этого нам нужно будет прописать некоторые настройки Wi-Fi.
4. Для того, чтобы избавиться от необходимости работать с Raspberry Pi, подключая к ней монитор, клавиатуру и мышку, мы будем использовать подключение с удаленного компьютера по ssh. Для этого нам нужно будет прописать некоторые настройки Wi-Fi.
@ -251,30 +253,81 @@ import bsp
```
```
Рассмотрим все компоненты робота и то, как ими можно управлять, какие данные с них можно получить.
Рассмотрим все компоненты робота и то, как ими можно управлять, какие данные с них можно получить.
1. Управление моторами. Управление моторами осуществляется с помощью четырех пинов GPIO, которые задают напрвление вращения 2х моторов и 2 PWM которые задают скорость вращения.
### Управление моторами
Рассмотрим управление моторами в роботе. Для этого на плате-шасси установлен двухканальный мостовой драйвер моторов TB6612FNG. На изображении ниже вы видите часть принципиальной схемы платы-шасси, отвечающей за управление моторами:
![motor](pic/bsp/motor.png)
Рассмотрим назначение выходов микросхемы:
* PWMA\PWMB - вход для управления скоростью вращения мотора, для канала A и В (соответственно, для первого и второго мотора) с помощью ШИМ (*англ. PWM*);
* AIN1\AIN2 - входы полумостов канала A;
* BIN1\BIN2 - входы полумостов канала B;
* А01\А02 - выходы полумостов канала А;
* В01\В02 - выходы полумостов канала В;
* STBY - включение микросхемы;
* VM - вход питания силовой части микросхемы, двигателей;
* VCC - вход питания логической части микросхемы;
* GND - земля.
---
***Н-мост***
Н-мост (англ. H-bridge) - это схема, позволяющая приложить напряжение к нагрузке в разных направлениях.
![H-bridge](pic/bsp/H-bridge.png)
H-мост состоит из четырех переключателей, котороми могут быть, наппример, транзисторы или реле. Когда ключи S1 и S4 замкнуты, а S2 и S3 разомкнуты, мотор крутится в одну сторону, если же замкнуть S2 и S3, а S4 и S1 разомкнуть - мотор будет крутиться в другую сторону.
---
![изображение-1.png](./изображение-1.png)
---
***ШИМ***
В библиотеке bsp.py уже сделанна обвязка так что вам останется только аказать мотор, скорость и направление вращения для взаимодействия.
ШИМ (широтно-импульсная модуляция, англ. PWM) - способ управления мощностью на нагрузке с помощью изменения скважности импульсов при постоянной амплитуде и частоте импульсов.
## Что-то про мою BSP.py
![pwm](pic/bsp/pwm.png)
### Мотор:
Основные параметры ШИМ-сигнала:
* Ui - мплитуда импульсов;
* Ton - время, когда сигнал включен;
* Toff - время, когда сигнал отключен;
* Tpwm - время периода ШИМ;
Мощность на нагрузке пропорциональна времени включенного и отключенного сигнала.
---
Вернемся к части принципиальной схемы, отвечающей за управление моторам. Видно, что оно осуществляется с помощью четырех пинов GPIO, которые задают напрвление вращения двух моторов (AIN1\AIN2, BIN1\BIN2) и двух пинов с функцией ШИМ (PWMA\PWMB), которые задают скорость вращения.
В библиотеке bsp.py реализован функционал, который позволит вам просто объявить объект-мотор, задать скорость и направление вращения:
```python
```python
m = motor()
m = motor()
speed = 10 # Скорость, по сути напряджение на моторе (0 .. 100)
speed = 10 # Скорость, по сути напрядение на моторе (0 .. 100)
m.forward(speed) # Ехать вперед со скоростью speed
m.forward(speed) # Ехать вперед со скоростью speed
m.backward(speed) # Ехать назад со скоростью speed
m.backward(speed) # Ехать назад со скоростью speed
m.left(speed) # Крутится вправо со скоростью speed
m.left(speed) # Крутиться вправо со скоростью speed
m.right(speed) # Крутится вдево со скоростью speed
m.right(speed) # Крутиться влево со скоростью speed
m.stop() # Остановится
m.stop() # Остановиться
m.setMotor(10, 20) # Выставить скорость (ШИМ) 10 на левом колесе, и 20 на правом.
m.setMotor(10, 20) # Выставить скорость (ШИМ) 10 на левом колесе, и 20 на правом.
# Скорость может быть от -100 до 100, знак определяет направление
# Скорость может быть от -100 до 100, знак определяет направление
```
```
### Бипер:
### Взаимодействие с пьезодинамиком (buzzer):
Пьезодинамик (англ. buzzer) - устройство на основе обратного пьезоэлектрического эффекта, который заключается в механической деформации пьезоэлектрика под воздействием электрического поля. Простыми словами - при подаче напряжения на пьезодинамик, устройство переводит его в колебание мембраны динамика.
![buzzer](pic/bsp/buzzer.jpg)
![buzzer_shem](pic/bsp/buzzer.png)
Взаимодествие с пьезодинамиком с помощью библиотеки bsp.py реализовано следующим образом:
```python
```python
b = beep()
b = beep()
@ -284,41 +337,55 @@ b.off() # Выключить пищалку, пищит до тех
### Джойстик:
### Джойстик:
На верхней плате-адаптере робота распположен джойстик. На изображении он обведен в красный кружок. Джойстик может возвращать информацию об отклонении его влево, вправо, вперед и вназад, а так же о центральном расположении.
![joystick1](pic/bsp/joystick1.png)
![joystick](pic/bsp/joystick.png)
Средствами bsp.py вы можете взаимодействовать с джойстиком следующим образом:
```python
```python
j = joystick()
j = joystick()
j.check_ctr() # Вернет еденицу если нажата Крестовина
j.check_ctr() # Вернет еденицу если нажата крестовина
j.check_a() # == нажата A
j.check_a() # == нажата A
j.check_b() # == нажата B
j.check_b() # == нажата B
j.check_c() # == нажата C
j.check_c() # == нажата C
j.check_d() # == нажата D
j.check_d() # == нажата D
```
```
Один из вариантов использования это:
Рассмотрим пример взаимодействия с джойстиком с помощью bsp.py:
```python
```python
j = joystick()
j = joystick()
b = beep()
b = beep()
while True: # В бесконечном цикле проверяем нажата ли кнопка
while True: # В бесконечном цикле проверяем нажата ли кнопка
if j.check_ctr():
if j.check_ctr():
b.on() # Если нажата то включаем бипер и печатаем слово
b.on() # Если нажата, то включаем пьезодинамик и печатаем слово
print("center")
print("center")
while j.check_ctr():
while j.check_ctr():
time.sleep(0.01) # Ждем когда кнопку отпустят
time.sleep(0.01) # Ждем когда кнопку отпустят
else:
else:
b.off() # Когда кнопку откустили выключим бипер
b.off() # Когда кнопку отпустили выключим пьезодинамик
```
```
Можно сюда добавить фотку платы с подписями.
### Управление с пульта
### Управление с пульта
На плате-адаптере расположен инфракрасный датчик, с помощью которого можно осуществлять управление роботом с помощью пульта дистанционного управления
![ir](pic/bsp/ir.png)
![ir_remote](pic/bsp/ir_remote.jpg)
Средствами bsp.py вы можете взаимодействовать с пультом следующим образом:
```python
```python
IR = IR_controll()
IR = IR_controll()
key = IR.getkey() # Присваеваем переменной key номер нажаной кнопки на пульте
key = IR.getkey() # Присваеваем переменной key номер нажатой кнопки на пульте
# Метод вернет None если не одна кнопка не нажата, код кнопки если ее нажали в данный момент и repeat до тех пор пока кнопку не отпустят
# Метод вернет None если не одна кнопка не нажата, или вернет код кнопки если ее нажали в данный момент, и repeat до тех пор пока кнопку не отпустят
```
```
Пример использования: программа которая выводит код нажатой кнпки:
Пример использования - программа которая выводит код нажатой кнпки:
```python
```python
ir = ir_controll()
ir = ir_controll()
@ -328,17 +395,25 @@ while True:
print(hex(key))
print(hex(key))
```
```
### Инфракрасный бампер
### Инфракрасные датчики для обнаружения препятствий
На плате-шасси робота расположены два инфракрасных датчика, которые предназначены для обнаружения препятствий роботом.
![ir_obtacle](pic/bsp/ir_obstacle.png)
*Нужно понимать, что с помощью такого датчика вы можете получить информацию о факте наличия препятствия, но не о том, как, например, оно далеко от вас. Такому типу датчиков могут помешать засветы, например от солнца.*
Средствами bsp.py вы можете взаимодействовать с инфракрасными датчиками следующим образом:
```python
```python
b = ir_bumper()
b = ir_bumper()
l = b.check_l() # Вернет 1 если препятствие зафиксированно левым бампером
l = b.check_l() # Вернет 1 если препятствие зафиксированно левым датчиком
r = b.check_r() # Вернет 1 если препятствие зафиксированно правым бампером
r = b.check_r() # Вернет 1 если препятствие зафиксированно правым датчиком
```
```
Пример кода, на консоль выводятся сенсоры которые фиксируют обьект.
Пример кода для работы с инфракрасными датчиками. В консоль выводится информация о сенсорах, которые фиксируют обьект:
```pythin
```python
b = ir_bumper()
b = ir_bumper()
while True:
while True:
if b.check_l():
if b.check_l():
@ -351,14 +426,33 @@ while True:
### Ультрозвуковой дальномер
### Ультрозвуковой дальномер
Для обнаружения препятствий и определения расстояний до них можно воспользоваться ультразвуковым дальномером.
![ultrasonic1](pic/bsp/ultrasonic.png)
![ultrasonic2](pic/bsp/ultrasonic.jpg)
Ультразвуковой датчик в формате модуля установлен в специальный разъем на плате-шасси робота.
---
***Ультразвуковой дальномер***
Ультразвуковой дальномер генерирует звуковые импульсы и слушает эхо. Замеряя время, за которое отраженная звуковая волна вернется обратно можно определить расстояние до объекта.
В отличие от инфракрасных датчиков, рассмотренных выше, мы можем получить информацию о расстоянии до объекта, так же такому сенсору будут нестрашны засветы от солнца, но он может плохо работать с очень тонкими и пушистыми предметами.
---
Средствами bsp.py вы можете взаимодействовать с ультразвуковыми датчиками следующим образом:
```python
```python
u = us_sensor()
u = us_sensor()
k = u.dist() # Вернет расстояние до обьекта считанное сенсором
k = u.dist() # Вернет расстояние до обьекта, считанное сенсором
```
```
Пример кода который будет выводить расстояние до обьекта до тех пор пока не будет надата ```Ctrl+C```:
Пример кода который будет выводить расстояние до обьекта до тех пор, пока не будет нажато сочетание клавиш ```Ctrl+C```: