С Новым годом! Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 25.09.2022
Сообщений: 17
1

Подключение ультразвукового датчика (или его альтернативы) к raspberry pi 3 в среде PROTEUS

24.11.2024, 05:50. Показов 282. Ответов 0

Author24 — интернет-сервис помощи студентам
Доброе утро! Подскажите, пожалуйста, кто умеет работать в среде Proteus, возможно ли подключить ультразвуковые датчики к raspberry pi 3? Лично у меня не получилось, в качестве альтернативы я решила собрать схему из потенциометра, вольтметра и аналого-цифрового преобразователя MCP8003 (так как RASPBERRY PI не имеет аналоговых входов). Скрин схемы прикреплю. И скрин полноценного проекта также прикреплю. Как мне кажется, схема верна, однако выполняя код для считывания сигнала с преобразователя всегда получаю 0. не понимаю, в чем проблема. Вообще, в своем проекте помимо описанного выше я использую инфракрасные датчики, их получилось подключить без проблем, а также lcd экран, который выводит текстовые результат, прописанный в коде. Пока что я застряла на моменте подключения УЗ датчиков или их аналогов. Может быть, кто-то знает в чем проблема и может помочь ? Буду очень благодарна!
Код
#!/usr/bin/python
import time
import RPi.GPIO as GPIO
import time
import os,sys
from urllib.parse import urlparse
sys.path.append(r'C:\Users\Angelina\AppData\Roaming\Python\Python36\site-packages')
import paho.mqtt.client as paho

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

'''
define pin for lcd
'''
# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005
delay = 1



# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E  = 11
LCD_D4 = 12
LCD_D5 = 13
LCD_D6 = 15
LCD_D7 = 16
slot1_Sensor = 29
slot2_Sensor = 31
slot3_Sensor = 32
GPIO.setup(LCD_E, GPIO.OUT)  # E
GPIO.setup(LCD_RS, GPIO.OUT) # RS
GPIO.setup(LCD_D4, GPIO.OUT) # DB4
GPIO.setup(LCD_D5, GPIO.OUT) # DB5
GPIO.setup(LCD_D6, GPIO.OUT) # DB6
GPIO.setup(LCD_D7, GPIO.OUT) # DB7
GPIO.setup(slot1_Sensor, GPIO.IN) 
GPIO.setup(slot2_Sensor, GPIO.IN) 
GPIO.setup(slot3_Sensor, GPIO.IN) 

GPIO.setup(23, GPIO.OUT)  # CLK (GPIO11)
GPIO.setup(21, GPIO.IN)   # MISO (GPIO10)
GPIO.setup(19, GPIO.OUT)   # MOSI (GPIO9)
GPIO.setup(24, GPIO.OUT)   # CS (Chip Select, GPIO8)

# Define some device constants
LCD_WIDTH = 16    # Maximum characters per line
LCD_CHR = True
LCD_CMD = False
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x90# LCD RAM address for the 3nd line


def on_connect(self, mosq, obj, rc):
        self.subscribe("Fan", 0)
    
def on_publish(mosq, obj, mid):
    print("mid: " + str(mid))

mqttc = paho.Client()                        # object declaration
# Assign event callbacks
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish

url_str = os.environ.get('CLOUDMQTT_URL', 'tcp://broker.emqx.io:1883') 
url = urlparse(url_str)
mqttc.connect(url.hostname, url.port)

distance_threshold = 50

'''
Function Name :lcd_init()
Function Description : this function is used to initialized lcd by sending the different commands
'''
def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  time.sleep(E_DELAY)
'''
Function Name :lcd_byte(bits ,mode)
Fuction Name :the main purpose of this function to convert the byte data into bit and send to lcd port
'''
def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = data
  # mode = True  for character
  #        False for command
 
  GPIO.output(LCD_RS, mode) # RS
 
  # High bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x10==0x10:
    GPIO.output(LCD_D4, True)
  if bits&0x20==0x20:
    GPIO.output(LCD_D5, True)
  if bits&0x40==0x40:
    GPIO.output(LCD_D6, True)
  if bits&0x80==0x80:
    GPIO.output(LCD_D7, True)
 
  # Toggle 'Enable' pin
  lcd_toggle_enable()
 
  # Low bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x01==0x01:
    GPIO.output(LCD_D4, True)
  if bits&0x02==0x02:
    GPIO.output(LCD_D5, True)
  if bits&0x04==0x04:
    GPIO.output(LCD_D6, True)
  if bits&0x08==0x08:
    GPIO.output(LCD_D7, True)
 
  # Toggle 'Enable' pin
  lcd_toggle_enable()
'''
Function Name : lcd_toggle_enable()
Function Description:basically this is used to toggle Enable pin
'''
def lcd_toggle_enable():
  # Toggle enable
  time.sleep(E_DELAY)
  GPIO.output(LCD_E, True)
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)
  time.sleep(E_DELAY)
'''
Function Name :lcd_string(message,line)
Function  Description :print the data on lcd 
'''

def spi_transfer(data):
    result = 0
    for bit in range(8):
        GPIO.output(19, (data >> (7 - bit)) & 0x01)  # передаем бит на MOSI
        GPIO.output(23, GPIO.HIGH)  # Поднимаем CLK
        time.sleep(0.000001)  # Задержка для стабильности
        GPIO.output(23, GPIO.LOW)  # Опускаем CLK
        time.sleep(0.000001)  # Задержка для стабильности
        result = (result << 1) | GPIO.input(21)  # Считываем бит с MISO
    return result
    
def read_adc(channel):
    if channel < 0 or channel > 7:
        return -1  # Неверный канал

    # Начальная передача для настройки MCP3008 (конфигурация SPI)
    GPIO.output(24, GPIO.LOW)  # Активируем MCP3008 (CS низкий)
    spi_transfer(1)  # Стартовый бит для MCP3008
    adc_value = spi_transfer((8 + channel) << 4)  # Канал 0-7
    adc_value = ((adc_value & 0x03) << 8)  # Ожидаем 8 старших бит
    adc_value |= spi_transfer(0)  # Получаем младшие 8 бит
    GPIO.output(24, GPIO.HIGH)  # Деактивируем MCP3008 (CS высокий)
    
    return adc_value
    
def calculate_distance(adc_value):
    # Преобразуем значение ADC в напряжение
    voltage = (adc_value / 1023.0) * 3.3
    # Используем примерное преобразование напряжения в расстояние
    distance = (voltage - 0.5) * 100  # Это зависит от вашего сенсора
    return distance

def lcd_string(message,line):
  # Send string to display
 
  message = message.ljust(LCD_WIDTH," ")
 
  lcd_byte(line, LCD_CMD)
 
  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

lcd_init()
lcd_string("welcome ",LCD_LINE_1)
time.sleep(0.5)
lcd_string("Car Parking ",LCD_LINE_1)
lcd_string("System ",LCD_LINE_2)
time.sleep(0.5)
lcd_byte(0x01,LCD_CMD) # 000001 Clear display
# Define delay between readings
delay = 5

while 1:
  # Print out results
  rc = mqttc.loop()
  slot1_status = GPIO.input(slot1_Sensor)

  time.sleep(0.2)
  slot2_status = GPIO.input(slot2_Sensor)
  time.sleep(0.2)
  slot3_status = GPIO.input(slot3_Sensor)
  time.sleep(0.2)
  
  adc_value = read_adc(0) 
  if adc_value != -1:
    distance = calculate_distance(adc_value)
    print(f"ADC Value: {adc_value}, Distance: {distance:.2f} cm")
  else:
    print("Not correct channel")
  
  if (slot1_status == True and distance < distance_threshold):
   lcd_string("Slot1 Parked  ",LCD_LINE_1)
   mqttc.publish("slot1","1")
   time.sleep(0.2)
  else:
    lcd_string("Slot1 Free  ",LCD_LINE_1)
    mqttc.publish("slot1","0")
    time.sleep(0.2)
    
  if (slot2_status == True):
   lcd_string("Slot2 Parked  ",LCD_LINE_2)
   mqttc.publish("slot2","1")
   time.sleep(0.2)
  else:
    lcd_string("Slot2 Free  ",LCD_LINE_2)
    mqttc.publish("slot2","0")
    time.sleep(0.2)

  if (slot3_status == True):
   lcd_string("Slot3 Parked  ",LCD_LINE_3)
   mqttc.publish("slot3","1")
   time.sleep(0.2)
  else:
    lcd_string("Slot3 Free  ",LCD_LINE_3)
    mqttc.publish("slot3","0")
    time.sleep(0.2)
Миниатюры
Подключение ультразвукового датчика (или его альтернативы) к raspberry pi 3 в среде PROTEUS   Подключение ультразвукового датчика (или его альтернативы) к raspberry pi 3 в среде PROTEUS  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2024, 05:50
Ответы с готовыми решениями:

Странное поведение ультразвукового датчика
Привет всем. Имеется проблема с ультразвуковым датчиком. Когда я подношу руку к датчику, то он...

Показания ультразвукового датчика HC-SR04
Здравствуйте, делаю на Arduino ультразвуковой измеритель расстояния на основе датчика HC-SR04,...

Proteus. Нарисовать схему снятия данных с датчика температуры и вывода на дисплей
Ребята, мне надо собрать микропроцессорную систему в Proteus, которая будет работать следующим...

принципиальная схема охранной системы на базе PIC16 в среде proteus
Доброго времени суток всем Суть моей делемы в том что мне нужна помощь нужно собрать...

Электронные часы с функцией будильника на базе Микроконтроллера AT89C51 в среде разработки Proteus
Здравствуйте уважаемые. Столкнулся с проблемой касаемо разработки кода для МК, который должен быть...

0
24.11.2024, 05:50
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2024, 05:50
Помогаю со студенческими работами здесь

Подключение raspberry
Всем привет, сейчас raspberry подключена к пк по такой схеме: ПК -&gt; usb кабель -&gt; ttl конвертер -&gt;...

Raspberry Pi B+ подключение к WiFi 5G
Здравствуйте! Столкнулся с проблемой подключения Raspberry Pi B+ к сети 5G. Используется...

nrf24l01 подключение к raspberry pi B model
Добрый день. есть raspberry pi b model, покупал в 2014 году, недавно купил nrf24l01. почитал в...

Подключение ЖК-дисплея в Proteus
Не мигает курсор, хотя код по идее верный. Ниже пишу код: .include &quot;m168def.inc&quot; ; Подключаем...

Raspberry pi ssh подключение через интернет
Здравствуйте. Недавно приобрел raspberry pi 3, после чего узнал, что ей возможно управлять через...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Как использовать Kotlin в Android разработке
InfoMaster 12.01.2025
Язык программирования Kotlin, разработанный компанией JetBrains, стал неотъемлемой частью современного мира Android-разработки. Первоначально представленный в 2011 году, Kotlin был официально. . .
Использование Go (Golang) в backend разработке
InfoMaster 12.01.2025
Язык программирования Go (Golang), разработанный компанией Google, стал важным инструментом для разработчиков программного обеспечения, особенно в области бэкенд-разработки. С момента своего. . .
Как работать с Laravel в PHP
InfoMaster 12.01.2025
Введение в Laravel Laravel представляет собой современный PHP-фреймворк с открытым исходным кодом, который значительно упрощает и ускоряет процесс разработки веб-приложений. Этот фреймворк был. . .
Как программировать под HCL Notes и создавать свои продукты на ее основе
InfoMaster 11.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой мощную платформу для разработки корпоративных приложений, которая сочетает в себе функции электронной почты, календаря,. . .
Как работать с SVN (Subversion)
InfoMaster 11.01.2025
Введение Система контроля версий является неотъемлемой частью современного процесса разработки программного обеспечения. Она обеспечивает управление изменениями в коде, позволяет отслеживать. . .
Использование GraphQL в JavaScript
InfoMaster 11.01.2025
Введение в GraphQL и его преимущества В современной разработке веб-приложений эффективный обмен данными между клиентом и сервером играет ключевую роль. GraphQL представляет собой язык запросов и. . .
Администрирован­­­­ие Git, продвинутые техники работы с Git
InfoMaster 11.01.2025
Основы управления репозиторием Эффективное управление Git-репозиторием требует глубокого понимания механизмов контроля доступа и инструментов администрирования. Рассмотрим ключевые аспекты. . .
Что такое HCL Notes и как с ним работать
InfoMaster 10.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой комплексную платформу для совместной работы и обмена информацией в корпоративной среде. Это многофункциональное решение,. . .
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
Аналог оператора switch case в Python
InfoMaster 10.01.2025
Оператор switch case используется в программировании для выбора одного из нескольких вариантов исполнения кода. Однако в языке Python этот оператор отсутствует. Понимание аналогов switch case в. . .
Отличия абстрактного класса от интерфейса
InfoMaster 10.01.2025
В современной разработке программного обеспечения существуют два основных механизма реализации абстракции: абстрактные классы и интерфейсы. Эти инструменты, хотя и схожи в своей основной цели -. . .
Как работать в Git
InfoMaster 10.01.2025
Git — это одна из наиболее популярных систем контроля версий, которая активно используется разработчиками по всему миру. Она позволяет эффективно управлять изменениями в коде, координировать работу. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru