raspberry-gpio-python (Python Raspberry Pi GPIO and programming)

Foreign design interface design was great, including the question: Read dirty with image stabilization, further comprising reading this data provides two ways, one way is blocked waiting for, there is a callback function, the former is commonly used in communications way, consider the integrity of the system architecture designed from the latter. This hardware interface design ideas worth learning.

Inputs (input)

There are several ways of getting GPIO input into your program. The first and simplest way is to check the input value at a point in time. This is known as 'polling' and can potentially miss an input if your program reads the value at the wrong time. Polling is performed in loops and can potentially be processor intensive. The other way of responding to a GPIO input is using 'interrupts' (edge detection). An edge is the name of a transition from HIGH to LOW (falling edge) or LOW to HIGH (rising edge).

Chinese speed reading: gpio There are many ways to enter our program, the simplest is polling data collected in this way will be lost at different times, but also to spend more CPU resources, another way to interrupt, the interrupt is triggered based on edges (digital circuits school had) to trigger it at the border, or the border triggered.

Pull up / Pull down resistors (pull-down, pull-down resistor)

If you do not have the input pin connected to anything, it will 'float'. In other words, the value that is read in is undefined because it is not connected to anything until you press a button or switch. It will probably change value a lot as a result of receiving mains interference.

To get round this, we use a pull up or a pull down resistor. In this way, the default value of the input can be set. It is possible to have pull up/down resistors in hardware and using software. In hardware, a 10K resistor between the input channel and 3.3V (pull-up) or 0V (pull-down) is commonly used. The RPi.GPIO module allows you to configure the Broadcom SOC to do this in software:

Chinese speed reading: when the interface is not connected to any equipment, this value may be read out a variety of results, which is "change", we can solve it with the number of pull-down or pull-down resistor, typically 10k number resistance. Then gpio form by configuration:

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP) # or GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 

(where channel is the channel number based on the numbering system you have specified - BOARD or BCM).

Testing inputs (polling) test input

You can take a snapshot of an input at a moment in time:

if GPIO.input(channel): print('Input was HIGH') else: print('Input was LOW') 

To wait for a button press by polling in a loop:

the while the GPIO . the INPUT ( Channel ) == the GPIO . LOW : Time . SLEEP ( 0.01 ) # 10 the wait MS to give the CPU Chance OTHER Things to do make slow 0.01 cpu to do other things, consider the performance of other concurrent processes

(this assumes that pressing the button changes the input from LOW to HIGH)

Chinese speed reading: It is assumed that the input key change from low to high

Interrupts and Edge detection (interruption boundary detection)

An edge is the change in state of an electrical signal from LOW to HIGH (rising edge) or from HIGH to LOW (falling edge). Quite often, we are more concerned by a change in state of an input than it's value. This change in state is an event.

To avoid missing a button press while your program is busy doing something else, there are two ways to get round this:

Chinese speed reading: to change the state border is a level signal from low to high, or high to low, at the same time, we are more concerned about the state of the input values, this change is the event, in order to avoid concurrent loss that event lost, gpio offers two ways to solve the problem of busy missing: thread blocked waiting for the callback function

  • the wait_for_edge() function
  • the event_detected() function
  • a threaded callback function that is run when an edge is detected

wait_for_edge () function (block accidents, edge detection, etc.)

The wait_for_edge() function is designed to block execution of your program until an edge is detected. In other words, the example above that waits for a button press could be rewritten as:

GPIO.wait_for_edge(channel, GPIO.RISING) 

Note that you can detect edges of type GPIO.RISING, GPIO.FALLING or GPIO.BOTH. The advantage of doing it this way is that it uses a negligible amount of CPU, so there is plenty left for other tasks.

If you only want to wait for a certain length of time, you can use the timeout parameter:

# The wait for up to 5 seconds The for A Rising Edge (timeout IS in milliseconds)
 Channel = the GPIO . Wait_for_edge ( Channel , GPIO_RISING , timeout = 5000 ) IF Channel IS None : Print ( 'Timeout occurred' ) the else : Print ( 'Edge Detected Channel oN ' , Channel ) 
Chinese speed reading: this means blocking the way, such as how long timeout parameters can be set in the GPIO, this applies to asynchronous work, we do not know how much time, because some applications less demanding real-time scene.

event_detected() function

The event_detected() function is designed to be used in a loop with other things, but unlike polling it is not going to miss the change in state of an input while the CPU is busy working on other things. This could be useful when using something like Pygame or PyQt where there is a main loop listening and responding to GUI events in a timely basis.

GPIO.add_event_detect(channel, GPIO.RISING) # add rising edge detection on a channel do_something() if GPIO.event_detected(channel): print('Button pressed') 

Note that you can detect events for GPIO.RISING, GPIO.FALLING or GPIO.BOTH.

    Chinese speed reading: Active Test

Threaded callbacks

RPi.GPIO runs a second thread for callback functions. This means that callback functions can be run at the same time as your main program, in immediate response to an edge. For example:

def my_callback(channel):
    print('This is a edge event callback function!') print('Edge detected on channel %s'%channel) print('This is run in a different thread to your main program') GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback) # add rising edge detection on a channel ...the rest of your program... 

If you wanted more than one callback function:

def my_callback_one(channel):
    print('Callback one') def my_callback_two(channel): print('Callback two') GPIO.add_event_detect(channel, GPIO.RISING) GPIO.add_event_callback(channel, my_callback_one) GPIO.add_event_callback(channel, my_callback_two) 

Note that in this case, the callback functions are run sequentially, not concurrently. This is because there is only one thread used for callbacks, in which every callback is run, in the order in which they have been defined.

  Chinese speed reading: is the callback function

Switch debounce(消抖)

You may notice that the callbacks are called more than once for each button press. This is as a result of what is known as 'switch bounce'. There are two ways of dealing with switch bounce:

  • add a 0.1uF capacitor across your switch.
  • software debouncing
  • a combination of both

To debounce using software, add the bouncetime= parameter to a function where you specify a callback function. Bouncetime should be specified in milliseconds. For example:

# add rising edge detection on a channel, ignoring further edges for 200ms for switch bounce handling
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=200) 

or

GPIO.add_event_callback(channel, my_callback, bouncetime=200) 

Remove event detection (to cancel the event test)

If for some reason, your program no longer wishes to detect edge events, it is possible to stop them:

GPIO.remove_event_detect(channel)

Guess you like

Origin www.cnblogs.com/macren/p/11928346.html