树莓派学习笔记——Shell脚本操作GPIO

0.前言
    树莓树莓派可以无痛入门linux,下面通过命令和shell脚本控制树莓派GPIO。通过本文可以熟悉多个linux命令,并熟悉shell脚本编写方法,并对IO重定向有一个基本的体会。我在学习树莓派的过程中积累了自信,现在觉得linux没那么神秘没那么难,反而充满了无穷的乐趣,希望通过博客把快乐带给大家。
    
    相关博文
    【树莓派学习笔记——GPIO功能学习】树莓派GPIO入门文章

1.引脚与编号关系

图1 引脚与编号关系
例如 Header-PIN7 对应WiringPi GPIO7 对应BCM GPIO4。

2.使用命令操作GPIO
    请耐心输入以下命令并查看效果
# 获得超级权限
sudo su
# 进入GPIO目录
cd /sys/class/gpio
# 使用ls查看gpio目录中的内容,可以查看到
# export gpiochip0 unexport 
ls
# GPIO操作接口从内核空间暴露到用户空间
# 执行该操作之后,该目录下会增加一个gpio4文件
echo 4 > export
# 进入GPIO4目录,该目录由上一步操作产生
cd gpio4
#   查看gpio4目录中的内容,可查看到
#   active_low direction edge power subsystem uevent value
ls 
# 设置GPIO4为输出方向
echo out > direction
# BCM_GPIO4输出逻辑高电平,LED点亮
echo 1 > value
#  BCM_GPIO4输出逻辑低电平,LED熄灭
echo 0 > value
# 返回上一级目录
cd ../
# 注销GPIO4接口
echo 4 > unexport
# 退出超级用户
exit

几点说明
【1】>符号为IO重定向符号,IO重定向是指改变linux标准输入和输出的默认设备,指向一个用户定义的设备。例如echo 4 > export便是把4写入到export文件中。
【2】linux内核中关于GPIO驱动的【资料】。

3.编写一个shell脚本
新建一个名为ledon.sh的脚本。
#!/bin/bash
#利用echo输出一些提示语句
echo export pin $1
echo $1 > /sys/class/gpio/export

echo setting direction to output
echo out > /sys/class/gpio/gpio$1/direction

echo setting pi high
echo 1 > /sys/class/gpio/gpio$1/value

几点说明
【1】如果在windows上编写shell脚本的话(后使用FTP工具传输至树莓派),必须保存为unix格式。shell脚本每行以\n结尾,而不是windows中的\r\n。可以使用notepad++格式转换功能完成变化。
【2】一般情况下,脚本文件可读可写,但不能被执行。需要通过chmod指令增加可执行功能,例如输入以下命令(请注意,需要通过cd指令进入shell脚本所在的目录)
   chmod +x ledon.sh
【3】shell脚本可传入参数,例如$1代表第一个参数,$2代表第二个参数,以此类推。

    运行该脚本可输入以下指令,使得BCM_GPIO4输出高电平
    sudo ./ledon.sh 4

4.总结
   其实树莓派GPIO控制就那么简单。
    
5.参考资料
【1】图书 《爱上树莓派》


  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
树莓派4B上,可以使用WiringPi库来进行GPIO控制。要检测8个GPIO的输入状态,可以按照以下步骤进行: 1. 安装WiringPi库: ``` sudo apt-get install wiringpi ``` 2. 编写C程序,使用wiringPiSetup()函数初始化WiringPi库,并使用wiringPiSetupGpio()函数将GPIO引脚模式设置为BCM模式。然后使用wiringPiISR()函数设置中断处理函数来检测GPIO输入状态,例如: ``` #include <wiringPi.h> #include <stdio.h> #define GPIO_1 18 #define GPIO_2 23 #define GPIO_3 24 #define GPIO_4 25 #define GPIO_5 12 #define GPIO_6 16 #define GPIO_7 20 #define GPIO_8 21 void gpioInterrupt1(void) { if (digitalRead(GPIO_1) == HIGH) { printf("GPIO 1 is HIGH\n"); } else { printf("GPIO 1 is LOW\n"); } } void gpioInterrupt2(void) { if (digitalRead(GPIO_2) == HIGH) { printf("GPIO 2 is HIGH\n"); } else { printf("GPIO 2 is LOW\n"); } } void gpioInterrupt3(void) { if (digitalRead(GPIO_3) == HIGH) { printf("GPIO 3 is HIGH\n"); } else { printf("GPIO 3 is LOW\n"); } } void gpioInterrupt4(void) { if (digitalRead(GPIO_4) == HIGH) { printf("GPIO 4 is HIGH\n"); } else { printf("GPIO 4 is LOW\n"); } } void gpioInterrupt5(void) { if (digitalRead(GPIO_5) == HIGH) { printf("GPIO 5 is HIGH\n"); } else { printf("GPIO 5 is LOW\n"); } } void gpioInterrupt6(void) { if (digitalRead(GPIO_6) == HIGH) { printf("GPIO 6 is HIGH\n"); } else { printf("GPIO 6 is LOW\n"); } } void gpioInterrupt7(void) { if (digitalRead(GPIO_7) == HIGH) { printf("GPIO 7 is HIGH\n"); } else { printf("GPIO 7 is LOW\n"); } } void gpioInterrupt8(void) { if (digitalRead(GPIO_8) == HIGH) { printf("GPIO 8 is HIGH\n"); } else { printf("GPIO 8 is LOW\n"); } } int main(void) { wiringPiSetup(); wiringPiSetupGpio(); pinMode(GPIO_1, INPUT); pinMode(GPIO_2, INPUT); pinMode(GPIO_3, INPUT); pinMode(GPIO_4, INPUT); pinMode(GPIO_5, INPUT); pinMode(GPIO_6, INPUT); pinMode(GPIO_7, INPUT); pinMode(GPIO_8, INPUT); wiringPiISR(GPIO_1, INT_EDGE_BOTH, &gpioInterrupt1); wiringPiISR(GPIO_2, INT_EDGE_BOTH, &gpioInterrupt2); wiringPiISR(GPIO_3, INT_EDGE_BOTH, &gpioInterrupt3); wiringPiISR(GPIO_4, INT_EDGE_BOTH, &gpioInterrupt4); wiringPiISR(GPIO_5, INT_EDGE_BOTH, &gpioInterrupt5); wiringPiISR(GPIO_6, INT_EDGE_BOTH, &gpioInterrupt6); wiringPiISR(GPIO_7, INT_EDGE_BOTH, &gpioInterrupt7); wiringPiISR(GPIO_8, INT_EDGE_BOTH, &gpioInterrupt8); while (1) { delay(1000); } return 0; } ``` 这里定义了8个GPIO引脚的编号,然后分别编写了8个中断处理函数,使用digitalRead()函数来读取GPIO输入状态,如果为HIGH则输出“GPIO x is HIGH”,否则输出“GPIO x is LOW”。然后在主函数中使用wiringPiISR()函数将中断处理函数绑定到相应的GPIO引脚上,并使用delay()函数来阻塞程序运行,等待中断事件的发生。 3. 编译程序并运行: ``` gcc -o gpio_test gpio_test.c -lwiringPi sudo ./gpio_test ``` 这样就可以检测8个GPIO的输入状态了。需要注意的是,这里使用了中断处理的方式来检测GPIO输入状态,因此在程序运行期间,如果有GPIO输入状态发生变化,就会触发相应的中断处理函数。如果不想使用中断处理方式,可以使用digitalRead()函数来轮询读取GPIO输入状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值