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

慈云数据 12个月前 (03-15) 技术支持 74 0

【全志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 
        3 #include 
        4 #include 
        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 
        2 #include 
        3 #include 
        4 #include 
        5 #include 
        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 
         2 #include 
         3 #include 
         4 #include 
         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 
         2 #include 
         3 #include 
         4 #include 
         5 #include 
         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
        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 }
        
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon