【全志H616】1 --用orangepi控制硬件

【全志H616】1 --用orangepi控制硬件

本文介绍了如歌用orangepi 控制蜂鸣器&超声波模块,通过键盘输入1、2、3、4来控制转动角度舵机模块;同时还介绍了利用全志如何配置定时器;以及查看H616引脚状态的命令等…

  • 超声波模块和舵机模块的讲解,在我之前写的博客里面啦

https://blog.csdn.net/Super_Fisher_man/article/details/135577251


  • 引脚说明
gpio readall //查看H616的引脚情况,及其状态

在这里插入图片描述

1、蜂鸣器实验

  1 //beep.c
  2 #include <stdio.h>
  3 #include <wiringPi.h>
  4 #include <unistd.h>
  5
  6 #define BEEP 0 //0 设置0脚为蜂鸣器的控制引脚
  7
  8 int main (void)
  9 {
 10
 11     wiringPiSetup();//初始化wiringPi库
 12
 13     pinMode(BEEP, OUTPUT);//设置IO口的输入输出,输出
 14
 15     while(1)
 16     {
 17         sleep(1);
 18         digitalWrite (BEEP, HIGH);  //设置IO口输出低电平,蜂鸣器响起
 19         sleep(1);//1s
 20         digitalWrite (BEEP, LOW);
 21     }
 22     return 0;
 23 }

2、超声波实验

  //cs_wave.c
  1 #include <stdio.h>
  2 #include <sys/time.h>
  3 #include <wiringPi.h>
  4 #include <stdlib.h>
  5 #include <unistd.h>
  6
  7 #define Trig 0
  8 #define Echo 1
  9
 10 double getDistance()
 11 {
 12     struct timeval start;
 13     struct timeval stop;
 14
 15     pinMode(Trig,OUTPUT);//IO口初始化,设置IO口的输入输出
 16     pinMode(Echo,INPUT);//读它的值 输入
 17
 18     //1、Trig引脚 由低变高,高电平维持10us
 19     digitalWrite(Trig,LOW);
 20     usleep(5);
 21     digitalWrite(Trig,HIGH);
 22     usleep(10);
 23     digitalWrite(Trig,LOW);
 24     /*以上是初始化超声波*/
 25
 26     //2、模块内部开自动发波
 27
 28     //3、直到 Echo 变为1,才执行下面的程序,否者卡住
 29     while(!digitalRead(Echo));//读 Echo 的值;要用digitalRead()函数
 30     gettimeofday(&start,NULL);
 31     //4、直到 Echo 变为0,才执行下面程序
 32     while(digitalRead(Echo));
 33     gettimeofday(&stop,NULL);//抓取两次时间,计算出时间差,得出 Echo 高电平持续时间
 34
 35     long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec-start.tv_usec);
 36     double dis = (double)diffTime/1000000*34000/2;//强转
 37
 38     return dis;
 39
 40 }

3.1、全志怎么配置定时器

  • 全志 通过定时器一秒输出一句Hello
//clock.c
 1 #include <stdio.h>
 2 #include <sys/time.h>
 3 #include <stdlib.h>
 4 #include <signal.h>
 5 static int i;
 6
 7 void signal_handler(int signum)
 8 {
 9     //1000  0.5*2000
10     i++;
11     if(i == 2000)
12     {
13         printf("hello\n");
14         i = 0;
15     }
16 }
17
18
19 int main()
20 {
21     struct itimerval itv;
22     //设定定时时间
23     itv.it_interval.tv_sec = 0;
24     itv.it_interval.tv_usec = 500;//0.5ms发送一次信号
25     //设定开始生效,启动定时器的时间
26     itv.it_value.tv_sec = 1;
27     itv.it_value.tv_usec = 0;
28     //设定定时方式
29     if(setitimer(ITIMER_REAL,&itv,NULL)) //SIGALRM
30     {
31         //ITIMER_REAL //数值为0,计时器的值实时递减,发送的信号是SIGALRM。
32         //ITIMER_VIRTUAL //数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
33         //ITIMER_PROF //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。
34         perror("error");
35         exit(-1);
36     }
37     //信号处理
38     signal(SIGALRM,signal_handler);//这边需要捕获对应的信号进行逻辑相关处理
39         //接收信号,跳到signal_handler函数
40
41     while(1);
42     return 0;
43
44 }

3.2 舵机开发:通过键盘输入1、2、3、4来控制转动角度

  // sg90.c
 // 橙色线,信号,红色VCC,黑色GND
 1 #include <stdio.h>
 2 #include <sys/time.h>
 3 #include <stdlib.h>
 4 #include <signal.h>
 5 #include <wiringPi.h>
 6
 7 #define SG90Pin 5//定义5脚为舵机信号线
 8
 9 int jd = 2;
10
11
12 void signal_handler(int signum)
13 {
14     static int i;
15     //500ms, 2/40 = 1/20 为高电平
16     if(i<=jd)
17     {
18         digitalWrite(SG90Pin,HIGH);
19     }
20     else
21     {
22         digitalWrite(SG90Pin,LOW);
23     }
24     if(i == 40)
25     {
26         i = 0;
27     }
28     i++;
29 }
30
31
32 int main()
33 {
34     struct itimerval itv;
35     jd = 0;
36     wiringPiSetup();
37     pinMode(SG90Pin, OUTPUT);//定义为输出
38
39     //设定定时时间
40     itv.it_interval.tv_sec = 0;
41     itv.it_interval.tv_usec = 500;//0.5ms发送一次信号
42     //设定开始生效,启动定时器的时间
43     itv.it_value.tv_sec = 1;
44     itv.it_value.tv_usec = 0;
45     //设定定时方式
46     if(setitimer(ITIMER_REAL,&itv,NULL)) //SIGALRM
47     {
48         //ITIMER_REAL //数值为0,计时器的值实时递减,发送的信号是SIGALRM。
49         //ITIMER_VIRTUAL //数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
50         //ITIMER_PROF //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。
51         perror("error");
52         exit(-1);
53     }
54     //信号处理
55     signal(SIGALRM,signal_handler);//这边需要捕获对应的信号进行逻辑相关处理
56         //接收信号,跳到signal_handler函数
57
58     while(1)
59     {
60         printf("input jd:1-0、2-45、3-90,4-135\n");
61         scanf("%d",&jd);
62
63     }
64     return 0;
65
66 }

欢迎大家一起交流讨论!

相关推荐

  1. H616学习笔记

    2024-03-15 17:56:01       13 阅读
  2. H713 Android 11 :给AOSP源码,新增一个Product

    2024-03-15 17:56:01       30 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-15 17:56:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-15 17:56:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-15 17:56:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-15 17:56:01       20 阅读

热门阅读

  1. 实景剧本杀小程序开发搭建

    2024-03-15 17:56:01       20 阅读
  2. Spring Boot写一个简单的PDF到Word的转换程序

    2024-03-15 17:56:01       19 阅读
  3. LinearLayout和RelativeLayout对比

    2024-03-15 17:56:01       21 阅读
  4. 利益相关者理论(stakeholder theory)

    2024-03-15 17:56:01       17 阅读
  5. 简单聊一下 Python asyncio

    2024-03-15 17:56:01       20 阅读
  6. 2085. 统计出现过一次的公共字符串

    2024-03-15 17:56:01       19 阅读
  7. MySQL--索引常见面试题详解

    2024-03-15 17:56:01       22 阅读
  8. Python中,如何检查一个变量是否存在?

    2024-03-15 17:56:01       19 阅读
  9. 【Android】源码中的单例模式

    2024-03-15 17:56:01       19 阅读
  10. 服务器通常会遭到哪些攻击手段?

    2024-03-15 17:56:01       21 阅读
  11. 无人机的航向角

    2024-03-15 17:56:01       20 阅读
  12. 计算机网络规划与设计 -- 设计基础

    2024-03-15 17:56:01       22 阅读