2024-12-14 19:16:40] Раис Габдуллин: Написать код
Считывается информация попеременно с двух пинов Rasberru pi с частотой 100 гц. Запускается процесс от сигнала на первом пине, количество импульсов суммируется и записывается до появления сигнала на втором пине которые суммируются и записываются. Цикл повторяется при появлении сигнала на первом пине.
Цикл заканчивается когда количество импульсов на первом и втором пине сравняются. Затем начинается новый цикл после появления сигнала на первом пине. Сигналы с первого пина записываются как единица а со второго как нуль. Полученный бинарный код преобразуем в равномерный подсчитывая количество единиц и нулей в каждой пачке единиц и нулей, которые затем отобразить наглядным графиком.
[2024-12-14 19:16:40] Chat GPT: Для реализации этой задачи на Raspberry Pi можно использовать библиотеку `RPi.GPIO` для работы с GPIO-пинами и `matplotlib` для построения графиков. Вот пример кода, который выполняет описанные вами задачи:
```python
import RPi.GPIO as GPIO
import time
import numpy as np
import matplotlib.pyplot as plt
# Настройка пинов
PIN_1 = 17 # Пин для первого сигнала
PIN_2 = 18 # Пин для второго сигнала
# Настройка GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN_1, GPIO.IN)
GPIO.setup(PIN_2, GPIO.IN)
def count_pulses(pin):
count = 0
start_time = time.time()
while True:
# Ждем сигнала на первом пине
if GPIO.input(PIN_1) == GPIO.HIGH:
break
while True:
# Считываем пульсы с первого пина до появления сигнала на втором
while GPIO.input(pin) == GPIO.HIGH:
count += 1
time.sleep(0.01) # Пауза для обеспечения чтения 100 Гц
if GPIO.input(PIN_2) == GPIO.HIGH:
break
return count
def main():
binary_code = []
while True:
print("Ожидание сигнала на первом пине...")
# Ждем сигнала на первом пине
GPIO.wait_for_edge(PIN_1, GPIO.RISING)
pulse_count_1 = count_pulses(PIN_1)
print(f"Количество импульсов на первом пине: {pulse_count_1}")
pulse_count_2 = count_pulses(PIN_2)
print(f"Количество импульсов на втором пине: {pulse_count_2}")
# Сохраняем результаты в бинарном коде
binary_code += [1] * pulse_count_1
binary_code += [0] * pulse_count_2
# Проверяем условие выхода из цикла
if pulse_count_1 == pulse_count_2:
print("Количество импульсов сравнялось. Начинаем новый цикл.")
# Визуализация
display_data(binary_code)
def display_data(data):
# Преобразование в пачки
counts = []
current_value = data[0]
count = 0
for bit in data:
if bit == current_value:
count += 1
else:
counts.append((current_value, count))
current_value = bit
count = 1
# Добавление последнего значения
if count > 0:
counts.append((current_value, count))
print("Пачки:", counts)
# Визуализация
labels, sizes = zip(*counts)
plt.bar(range(len(counts)), sizes, tick_label=[f'{label}' for label in labels])
plt.ylabel('Количество')
plt.xlabel('Значение')
plt.title('Пачки единиц и нулей')
plt.show()
try:
main()
except KeyboardInterrupt:
print("Завершение программы.")
finally:
GPIO.cleanup()
```
### Пояснения к коду:
1. Код использует библиотеку `RPi.GPIO` для работы сGPIO-пинами Raspberry Pi.
2. Запускается основной цикл, который ждет, пока не получит сигнал на первом пине.
3. Функция `count_pulses` считает количество импульсов на заданном пине до появления сигнала на другом пине.
4. Сохраненные данные кодируются в бинарный массив, где 1 — это импульсы с первого пина, а 0 — с второго.
5. После окончания отслеживания импульсов выполняется визуализация с помощью `matplotlib`, где высота столбиков показывает количество подряд идущих единиц и нулей.
### Зависимости:
Чтобы запустить этот код, вам понадобятся следующие библиотеки:
```bash
pip install matplotlib numpy RPi.GPIO
```
### Примечание:
- Перед запуском кода обязательно проверьте, правильно ли подключены пины и нет ли в этом конфликта. Тестируйте программу осторожно, чтобы не повредить оборудование.
- Убедитесь, что вы запустили скрипт с правами администратора, поскольку работа с GPIO требует этого.
Комментарии
Отправить комментарий