CircuitPython

Для работы с датчиком используем интерпретатор CircuitPython, который позволяет писать программы на упрощённом python. CircuitPython поддерживается большинством плат Графит, включая модели: Графит-S2, Графит-S3, Графит-RP2040 и Графит-RP2354.

Основной библиотекой для модуля часов DS3231 будет служить robotclass_qtr от RobotClass. Всё, что нам нужно сделать для её установки — это скопировать файл robotclass_qtr.mpy в папку lib на накопителе CIRCUITPY.

Программа

Для составления программы используем среду разработки RV Circuit Studio.

Сперва напишем программу, которая в суперцикле будет получать сырые данные от датчика и выводить их в терминал. Начнём с подключения всех необходимых библиотек. Помним, что в python это делается с помощью команды import.

Кроме robotclass_qtr нам будут нужны еще две библиотеки:

  • time — предоставляет функцию sleep для организации паузы;
  • board — хранит названия всех контактов платы контроллера и их синонимы.
import time
import board
import robotclass_qtr

В начале программы настроим датчик. set_type_rc — определяет тип датчика: RC или аналоговый. С помощью set_sensor_pins указываем контакты, к которым подключены отдельные датчики отражения. set_emitter_pin — задаёт контакт общего включения всех датчиков отражения.

Чтение показаний датчиков осуществляется при помощи функции read.

import time
import board
from robotclass_qtr import QTRSensors, ON

qtr = QTRSensors()
qtr.set_type_rc()
qtr.set_sensor_pins([board.D4, board.D5, board.D6, board.D7]) # контакты подключения датчиков отражения
qtr.set_emitter_pin(board.D17) # контакт общего включения ENO/ENE

values = [0] * qtr.get_size()
while True:
    position = qtr.read(values, ON)
    print("values =", values)
    time.sleep(0.05)

Загружаем программу на Графит и открываем REPL терминал. Разместим датчик над черной линией, как будто робот по ней едет. Смотрим как меняется поток данных.

values = [274, 1220, 1342, 274]
values = [244, 1190, 1373, 244]
values = [274, 1251, 1373, 274]
values = [244, 1190, 1373, 244]

Калибровка

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

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

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

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

import time
import board
from robotclass_qtr import QTRSensors, RC, ON, ODD_EVEN

qtr = QTRSensors()
qtr.set_type_rc()
qtr.set_sensor_pins([board.D4, board.D5, board.D6, board.D7]) # контакты подключения датчиков отражения
qtr.set_emitter_pin(board.D17)  # контакт общего включения ENO/ENE

# Калибровка: проведите датчиками над чёрной и белой поверхностями
print("Calibrating...")
for _ in range(500):
    qtr.calibrate(ON)
    time.sleep(0.02)
print("Done.")

# сохранение min и max в переменные
cal_min = list(qtr.calibration_on.minimum)
cal_max = list(qtr.calibration_on.maximum)
print("min:", cal_min)
print("max:", cal_max)

values = [0] * qtr.get_size()
while True:
    position = qtr.read_line_black(values, ON)
    print("pos =", position, "values =", values)
    time.sleep(0.05)

Изменено: