Raspberry Pi GPIO: Difference between revisions

From Wildsong
Jump to navigationJump to search
Brian Wilson (talk | contribs)
Created page with "Okay, I need to connect input and output to a Pi to test it for the Repeater Linking project. # A push button with a 2 pin connector to simulate COR input. # An LED to simulate PTT output."
 
Brian Wilson (talk | contribs)
mNo edit summary
Line 3: Line 3:
# A push button with a 2 pin connector to simulate COR input.
# A push button with a 2 pin connector to simulate COR input.
# An LED to simulate PTT output.
# An LED to simulate PTT output.
The pin can be programmed with a pull up resistor, so I can connect the button to GPIO23 and the adjacent GND. Pushing the button gives me a zero.
The LED can go anywhere. I pull it down so it is between +5V and GPIO18
== Python test program ==
from time import sleep
#Set warnings off (optional)
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#Set Button and LED pins
Button = 23
LED = 18
#Setup Button and LED
GPIO.setup(Button,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(LED,GPIO.OUT)
old_button_state = 2
led_on = False
delay = .2
while True:
    button_state = GPIO.input(Button)
    if button_state != old_button_state:
        print(button_state)
        old_button_state = button_state
    if button_state == 0:
        delay = .10
    else:
        delay = .3
    if led_on:
        GPIO.output(LED,GPIO.HIGH)
        led_on = False
    else:
        GPIO.output(LED,GPIO.LOW)
        led_on = True
    sleep(delay)
== Configure GPIO pins in SVXLINK ==
This is done by setting up /etc/svxlink/gpio.conf and then restarting svxlink.  The brief version of the file is
GPIO_USER="svxlink"
GPIO_GROUP="svxlink"
GPIO_MODE="0664"
GPIO_PATH=/sys/class/gpio
GPIO_OUT_LOW="gpio18"
GPIO_IN_LOW="gpio23"
Before I learned that I could use this file I did it the hard way. Like this.
echo "Setting GPIO pin 18 as an output. (PTT)"
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction
echo "Setting GPIO pin 23 as an input (COR)."
echo "23" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio23/direction
'''Question''': Can I read the state of a pin?? '''Answer''': yes. For example, read the button and show its state once every 2 seconds.
watch cat /sys/class/gpio/gpio23/value
'''Question''', what about the LED? Read its state. Write 1's and 0's. Huh. It is set as input! First set it as
systemctl stop svxlink
echo "out" > /sys/class/gpio/gpio18/direction
while true; do echo 0 > /sys/class/gpio/gpio18/value; sleep 1; echo 1 > /sys/class/
gpio/gpio18/value; sleep 1; done
Does this code work when I am running svxlink though? '''Yes, it does.''' That means I can use "echo" commands to test.
I am wondering why GPIO18 was set as input. Is the gpio.conf getting read? It's "in" again after a reboot. Oops. File was wrong. Fixed. Rebooted.

Revision as of 01:01, 20 February 2023

Okay, I need to connect input and output to a Pi to test it for the Repeater Linking project.

  1. A push button with a 2 pin connector to simulate COR input.
  2. An LED to simulate PTT output.

The pin can be programmed with a pull up resistor, so I can connect the button to GPIO23 and the adjacent GND. Pushing the button gives me a zero.

The LED can go anywhere. I pull it down so it is between +5V and GPIO18

Python test program

from time import sleep
#Set warnings off (optional)
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#Set Button and LED pins
Button = 23
LED = 18
#Setup Button and LED
GPIO.setup(Button,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(LED,GPIO.OUT)

old_button_state = 2
led_on = False
delay = .2

while True:
    button_state = GPIO.input(Button)
    if button_state != old_button_state:
        print(button_state)
        old_button_state = button_state

    if button_state == 0:
        delay = .10
    else:
        delay = .3

    if led_on:
        GPIO.output(LED,GPIO.HIGH)
        led_on = False
    else:
        GPIO.output(LED,GPIO.LOW)
        led_on = True

    sleep(delay)

Configure GPIO pins in SVXLINK

This is done by setting up /etc/svxlink/gpio.conf and then restarting svxlink. The brief version of the file is

GPIO_USER="svxlink"
GPIO_GROUP="svxlink"
GPIO_MODE="0664"
GPIO_PATH=/sys/class/gpio

GPIO_OUT_LOW="gpio18"
GPIO_IN_LOW="gpio23"

Before I learned that I could use this file I did it the hard way. Like this.

echo "Setting GPIO pin 18 as an output. (PTT)"
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction

echo "Setting GPIO pin 23 as an input (COR)."
echo "23" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio23/direction

Question: Can I read the state of a pin?? Answer: yes. For example, read the button and show its state once every 2 seconds.

watch cat /sys/class/gpio/gpio23/value

Question, what about the LED? Read its state. Write 1's and 0's. Huh. It is set as input! First set it as

systemctl stop svxlink
echo "out" > /sys/class/gpio/gpio18/direction
while true; do echo 0 > /sys/class/gpio/gpio18/value; sleep 1; echo 1 > /sys/class/
gpio/gpio18/value; sleep 1; done

Does this code work when I am running svxlink though? Yes, it does. That means I can use "echo" commands to test.

I am wondering why GPIO18 was set as input. Is the gpio.conf getting read? It's "in" again after a reboot. Oops. File was wrong. Fixed. Rebooted.