【RK3399Pro学习笔记】十八、点亮LED灯(python、C语言、bash)

目录

  • GPIO
  • python3
    • python-periphery
  • python2
    • RPi
  • C语言
    • SysFs方式
      • 编写
        • gpiolib.c
        • gpiolib.h
        • main.c
      • 编译
      • 测试
    • wiringPi
  • bash

平台:华硕 Thinker Edge R 瑞芯微 RK3399Pro
固件版本:Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615


GPIO

        (机翻)下表显示了座子的引脚,包括每个端口的sysfs路径,这通常是使用外围库时需要的名称。你也可以通过在命令行中输入pinout来查看座子的引脚。
        备注
        I. 第32、33、37号I/O引脚为+3.0V电平,它有61K欧姆的内部下拉电阻,3mA驱动电流容量。
        II. 除了32、33、37号引脚外,所有的I/O引脚都是+3.0V电平。32、33、37号引脚,其他引脚都是+3.3V电平,有5K~10K欧姆的内部上拉电阻,50mA的驱动电流容量。
在这里插入图片描述
在这里插入图片描述驱动库函数:
/usr/local/share有如下文件:

在这里插入图片描述说明已预装wiringPi和RPi库
使用gpio readall命令查看引脚对应情况:
在这里插入图片描述

python3

python-periphery

参考资料:《Tinker_Edge_R_Getting_Started》

python-periphery API手册

sudo apt-get update
sudo apt-get install python3-pip
sudo pip3 install python-periphery

(官方例程)在合适的地方编写代码
其使用CPU编号

from periphery import GPIO
import timeLED_Pin = 73 #Physical Pin-3 is GPIO 73
# Open GPIO /sys/class/gpio/gpio73 with output direction
LED_GPIO = GPIO(LED_Pin, "out")while True:try: #Blink the LEDLED_GPIO.write(True)# Send HIGH to switch on LEDprint("LED ON!")time.sleep(0.5)LED_GPIO.write(False)# Send LOW to switch off LEDprint("LED OFF!")time.sleep(0.5)except KeyboardInterrupt:# Turn LED off before stoppingLED_GPIO.write(False)breakexcept IOError:print ("Error")LED_GPIO.close()

运行

sudo python3 blink.py

可见LED灯闪烁
在这里插入图片描述

python2

RPi

在合适的地方编写代码:

nano blink.py
#!/usr/bin/env python2.7  # import ASUS.GPIO as GPIO  
import RPi.GPIO as GPIO  # 两种均可from time import sleep     # this lets us have a time delay LED_PIN = 3             
LED_PIN_BCM = 2 GPIO.setmode(GPIO.BOARD)    # BOARD 对应 physical numbers 
GPIO.setup(LED_PIN, GPIO.OUT, initial=GPIO.HIGH)    
for _ in range(10):GPIO.output(LED_PIN, GPIO.HIGH)sleep(0.5)GPIO.output(LED_PIN, GPIO.LOW)sleep(0.5)
GPIO.output(LED_PIN, GPIO.HIGH)
GPIO.cleanup()GPIO.setmode(GPIO.BCM)          # BCM 对应 GPIO numbers
GPIO.setup(LED_PIN_BCM, GPIO.OUT, initial=GPIO.HIGH)  
for _ in range(10):GPIO.output(LED_PIN_BCM, GPIO.HIGH)sleep(0.25)GPIO.output(LED_PIN_BCM, GPIO.LOW)sleep(0.25)
GPIO.output(LED_PIN_BCM, GPIO.HIGH)
GPIO.cleanup()

BCM —— GPIO numbers
在这里插入图片描述
(运行前记得把脚本中的中文删去)
sudo python2 ./blink.py可见LED灯闪烁

C语言

SysFs方式

本代码来自SysFs方式下C语言控制GPIO(RK3399)—— 姚家湾

编写

在合适的地方编写代码:

gpiolib.c

nano gpiolib.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/stat.h>
#include "gpiolib.h"int gpio_direction(int gpio, int dir)
{int ret = 0;char buf[50];sprintf(buf, "/sys/class/gpio/gpio%d/direction", gpio);int gpiofd = open(buf, O_WRONLY);if (gpiofd < 0){perror("Couldn't open IRQ file");ret = -1;}if (dir == 2 && gpiofd){if (3 != write(gpiofd, "high", 3)){perror("Couldn't set GPIO direction to out");ret = -2;}}if (dir == 1 && gpiofd){if (3 != write(gpiofd, "out", 3)){perror("Couldn't set GPIO direction to out");ret = -3;}}else if (gpiofd){if (2 != write(gpiofd, "in", 2)){perror("Couldn't set GPIO directio to in");ret = -4;}}close(gpiofd);return ret;
}int gpio_setedge(int gpio, int rising, int falling)
{int ret = 0;char buf[50];sprintf(buf, "/sys/class/gpio/gpio%d/edge", gpio);int gpiofd = open(buf, O_WRONLY);if (gpiofd < 0){perror("Couldn't open IRQ file");ret = -1;}if (gpiofd && rising && falling){if (4 != write(gpiofd, "both", 4)){perror("Failed to set IRQ to both falling & rising");ret = -2;}}else{if (rising && gpiofd){if (6 != write(gpiofd, "rising", 6)){perror("Failed to set IRQ to rising");ret = -2;}}else if (falling && gpiofd){if (7 != write(gpiofd, "falling", 7)){perror("Failed to set IRQ to falling");ret = -3;}}}close(gpiofd);return ret;
}int gpio_export(int gpio)
{int efd;char buf[50];int gpiofd, ret;/* Quick test if it has already been exported */sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio);efd = open(buf, O_WRONLY);if (efd != -1){close(efd);return 0;}efd = open("/sys/class/gpio/export", O_WRONLY);if (efd != -1){sprintf(buf, "%d", gpio);ret = write(efd, buf, strlen(buf));if (ret < 0){perror("Export failed");return -2;}close(efd);}else{// If we can't open the export file, we probably// dont have any gpio permissionsreturn -1;}return 0;
}void gpio_unexport(int gpio)
{int gpiofd, ret;char buf[50];gpiofd = open("/sys/class/gpio/unexport", O_WRONLY);sprintf(buf, "%d", gpio);ret = write(gpiofd, buf, strlen(buf));close(gpiofd);
}int gpio_getfd(int gpio)
{char in[3] = {0, 0, 0};char buf[50];int gpiofd;sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio);gpiofd = open(buf, O_RDWR);if (gpiofd < 0){fprintf(stderr, "Failed to open gpio %d value\n", gpio);perror("gpio failed");}return gpiofd;
}int gpio_read(int gpio)
{char in[3] = {0, 0, 0};char buf[50];int nread, gpiofd;sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio);gpiofd = open(buf, O_RDWR);if (gpiofd < 0){fprintf(stderr, "Failed to open gpio %d value\n", gpio);perror("gpio failed");}do{nread = read(gpiofd, in, 1);} while (nread == 0);if (nread == -1){perror("GPIO Read failed");return -1;}close(gpiofd);return atoi(in);
}int gpio_write(int gpio, int val)
{char buf[50];int nread, ret, gpiofd;sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio);gpiofd = open(buf, O_RDWR);if (gpiofd > 0){snprintf(buf, 2, "%d", val);ret = write(gpiofd, buf, 2);if (ret < 0){perror("failed to set gpio");return 1;}close(gpiofd);if (ret == 2)return 0;}return 1;
}int gpio_select(int gpio)
{char gpio_irq[64];int ret = 0, buf, irqfd;fd_set fds;FD_ZERO(&fds);snprintf(gpio_irq, sizeof(gpio_irq), "/sys/class/gpio/gpio%d/value", gpio);irqfd = open(gpio_irq, O_RDONLY, S_IREAD);if (irqfd < 1){perror("Couldn't open the value file");return -13;}// Read first since there is always an initial statusret = read(irqfd, &buf, sizeof(buf));while (1){FD_SET(irqfd, &fds);ret = select(irqfd + 1, NULL, NULL, &fds, NULL);if (FD_ISSET(irqfd, &fds)){FD_CLR(irqfd, &fds); // Remove the filedes from set// Clear the junk data in the IRQ fileret = read(irqfd, &buf, sizeof(buf));return 1;}}
}

gpiolib.h

nano gpiolib.h
#ifndef _GPIOLIB_H_
#define _GPIOLIB_H_
/* returns -1 or the file descriptor of the gpio value file */
int gpio_export(int gpio);
/* Set direction to 2 = high output, 1 low output, 0 input */
int gpio_direction(int gpio, int dir);
/* Release the GPIO to be claimed by other processes or a kernel driver */
void gpio_unexport(int gpio);
/* Single GPIO read */
int gpio_read(int gpio);
/* Set GPIO to val (1 = high) */
int gpio_write(int gpio, int val);
/* Set which edge(s) causes the value select to return */
int gpio_setedge(int gpio, int rising, int falling);
/* Blocks on select until GPIO toggles on edge */
int gpio_select(int gpio);/* Return the GPIO file descriptor */
int gpio_getfd(int gpio);#endif //_GPIOLIB_H_

main.c

nano main.c

其使用CPU编号

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "gpiolib.h"int main(int argc, char **argv)
{int gpio_pin;if (argc != 2){printf("Too few parameters in call!\r\n");return -1;}gpio_pin = atoi(argv[1]);gpio_export(gpio_pin);gpio_direction(gpio_pin, 1);for (int i = 0; i < 5; i++){printf(">> GPIO %d Low\n", gpio_pin);gpio_write(gpio_pin, 0);sleep(1);printf(">> GPIO %d High\n", gpio_pin);gpio_write(gpio_pin, 1);sleep(1);}gpio_unexport(gpio_pin);return 0;
}

编译

编写Makefile文件

nano Makefile
main: main.o gpiolib.occ -o main main.o gpiolib.o
main.o: main.c gpiolib.hcc -c main.c gpiolib.h
gpiolib.o: gpiolib.c gpiolib.hcc -c gpiolib.c
.PHONY:clear
clear:rm *.orm main

编译

make

测试

可见LED灯闪烁

chmod +x ./main
sudo ./main 73

wiringPi

编写
在合适的地方编写代码:
其使用wiringPi编号

nano main.c
#include <wiringPi.h>int main(int argc, char * argv[])
{ char i;wiringPiSetup();pinMode(8, OUTPUT);for(i = 0; i < 10; ++i){digitalWrite(8, HIGH);delay(500);digitalWrite(8, LOW);delay(500);}digitalWrite(8, HIGH);return 0;
}

编译

gcc -o main.o main.c -lwiringPi

运行目标文件

sudo ./main.o

可见LED灯闪烁

bash

在合适的地方编写代码:
其使用wiringPi编号

nano blink.sh
# !/bin/bashPIN=8gpio mode $PIN outwhile true; dogpio write $PIN 1sleep 0.5gpio write $PIN 0sleep 0.5
done

运行:

sh blink.sh

可见LED灯闪烁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jquery - 添加属性、添加class、添加Css

Jquery - 添加属性、添加class、添加Css 一.设置属性&#xff1a; 方式一 jQuery 代码: $("img").attr({ src: "test.jpg", alt: "Test Image" } 方式二&#xff1a;jQuery代码--键值对 $("img").attr("src","te…

PHP笔记——java程序员看懂PHP程序

PHP笔记——java程序员看懂PHP程序 php是一种服务器端脚本语言&#xff0c;类型松散的语言。<?php ?> xml风格<script language”php”></script> 脚本风格 <? ?> 简短风格 <% %> ASP风格 以;结尾&#…

C# mysql 插入数据,中文乱码

用C#操作mysql时&#xff0c; 插入数据中文都是乱码&#xff0c;只显示问号&#xff0c;数据库本身使用的是utf-8字符。网上百度一下有两种解决办法&#xff1a; 一种是在执行语句前面设置&#xff0c;如&#xff1a;MySQLCommand mCommand new MySQLCommand("set names …

C# list与数组互相转换

1. 从System.String[]转到List<System.String>System.String[] str{"str","string","abc"};List<System.String> listSnew List<System.String>(str);2. 从List<System.String>转到System.String[]List<System.Strin…

Linux中python、C++和C语言的多线程用法整理(_thread、threading、thread和pthread)

目录python3开始学习Python线程_thread常量和函数&#xff1a;锁对象试用基本功能试用线程同步threading函数常量类线程本地数据线程对象锁对象递归锁对象条件对象信号量对象Semaphore 例子事件对象定时器对象栅栏对象在 with 语句中使用锁、条件和信号量测试Cstd::threadstd::…

[原]关于在 iOS 中支持 DLNA

目前国内的视频播放器中&#xff0c;支持 DLNA 播放比较好的是&#xff1a;腾讯视频。 刚才反编了一下他们的代码&#xff0c;发现使用了一个开源库&#xff0c; 地址&#xff1a;https://github.com/FuruyamaTakeshi/DLNA 并且在这个库的基础了做了一层封装&#xff0c;包含如…

Swing-BoxLayout用法-入门

注&#xff1a;本文内容源于http://www.java3z.com/cwbwebhome/article/article20/200016.html?id4797&#xff1b;细节内容根据笔者理解有修改。 BoxLayout 可以把控件依次进行水平或者垂直排列布局&#xff0c;这是通过参数 X_AXIS、Y_AXIS 来决定的。X_AXIS 表示水平排列&a…

Python开发利器之UliPad

一、安装Ulipad 因为ulipad编辑器使用的是wxpython编写的gui&#xff0c;所以我们需要第三方库wxpython的支持&#xff0c;先讲一下Ulipad在Windows系统环境下的安装&#xff1a; 1. 确实自己的windows版本&#xff0c;32位还是64位的。2. 查看自己安装的 Python版本&#xff0…

网页中如何使用一些特殊字体

虽然我们可以通过图片&#xff0c;flash、SIFR等技术来实现网页使用特殊字体&#xff0c;有利于SEO网页中嵌入特殊字体方法&#xff0c;font-face属性。 通常网页上不能使用一些特殊字体&#xff0c;否则浏览者可能无法正确浏览到&#xff0c;虽然我们可以通过图片&#xff0c…

Google浏览器中的开发工具.

惯例 我是温浩然: google浏览器&#xff0c;按下F12后&#xff0c;出现开发控制台。 下面有这么几栏&#xff0c;elements,network,sources,timeline ,profiles,resources,audits ,console. elements&#xff0c;是页面源码&#xff0c;network&#xff0c;是看请求的&#xff…

【思考】一次交付项目小结

【背景】 公司销售谈了一个重要的项目&#xff0c;与我们正在研发的一个产品关系比较大&#xff0c;可惜前期由于种种原因&#xff0c;耽搁了很长时间&#xff0c;等到我们研发部门知道消息的时候&#xff0c;已经很晚了。9月中旬启动&#xff0c;11月下旬要求上线&#xff0c;…

flask接收前台的form数据

html 记得访问从服务里打开 表单html 不能直接打开表单html https://www.cnblogs.com/wanghaonull/p/6340096.html

【bzoj4399】魔法少女LJJ 并查集+权值线段树合并

题目描述 在森林中见过会动的树&#xff0c;在沙漠中见过会动的仙人掌过后&#xff0c;魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新、淡雅,到处散发着醉人的奶浆味&#xff1b;小猴在枝头悠来荡去,好不自在&#xf…

树莓派Raspbian Buster/Debian 10 安装ROS

目录一些补充安装ROS初始化rosdep测试平台&#xff1a;树莓派4B 系统版本&#xff1a; 2020-05-27-raspios-buster-arm64.img 一些补充 系统安装参考 【树莓派学习笔记】一、烧录系统、(无屏幕)配置Wifi和SSH服务 【树莓派学习笔记】二、(无屏幕)SSH远程登录、图形界面及系统…

pjsip视频通信开发(上层应用)之EditText重写

我们经常使用手机的打电话功能&#xff0c;当我们按键盘的时候&#xff0c;有一个地方显示我们按键的内容&#xff0c;当我们的手点击那个地方的时候&#xff0c;并没有弹出软件盘&#xff0c;所以我们再有数字键盘的时候&#xff0c;要屏蔽系统的软件盘。 我们分析一下&#x…

JavaWeb重要知识点总结

JavaWeb学习篇之----容器Response详解http://blog.csdn.net/jiangwei0910410003/article/details/22886847获得所有请求头名称和头信息java.util.Enumeration names request.getHeaderNames();System.out.println("");while(names.hasMoreElements()){String name …

pycharm 中HTML代码的对齐

以前用sublime &#xff0c;现在django要在pycharm编辑html&#xff0c;要实现html的格式化&#xff0c; 用快捷键 CtrlAltL 非常实用

树莓派安装Ubuntu MATE及ROS系统

目录解锁SSH换源安装VNC服务安装ROS初始化rosdep和环境测试平台&#xff1a;树莓派4B 系统版本&#xff1a; ubuntu-mate-20.04.1-desktop-armhfraspi.img 在Raspberry Pi Download Options下载系统镜像 在树莓派资源下载 | 树莓派实验室下载工具 使用SDForm…

mysql 清空表的两种方法

一、Delete DELETE FROM table; 二、Truncate TRUNCATE table; 第一种方法其实就是去掉where条件&#xff0c;没有了条件&#xff0c;也就是删除掉表里面的所有记录了&#xff1b; 第二种方法像是重置表&#xff0c;把表中内容全部清除&#xff0c;回到刚建好表的状态&#xff…

jQuery学习笔记(四)

jQuery对表单、表格的操作及更多应用 表单应用 一个表单组成部分&#xff1a; 表单标签、表单域及表单按钮 单行文本框应用获取和失去焦点事件 $(function(){ $(":input").focus(function(){ //获取焦点触发事件 $(this).addClass("focus"); //增加样…