查看: 7194|回复: 11

香蕉派+L298n免单片机方案设计

[复制链接]
  • TA的每日心情
    开心
    2014-10-12 13:06
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-12-29 17:04:15 | 显示全部楼层 |阅读模式
    分享到:
           之前发过两个BPI小车的帖子,都是ser2net+STM32方案的,虽然得到了不少人的认同,但还是觉得这是对BPI的“侮辱”,完全没有必要用STM32就能实现,现在我给出设计方案和源代码,希望能帮上更多人能实现自己“裙底小车”的梦想,哈哈……
    这是之前BPI+STM32+L298n的方案照片:

    IMG_1437.jpg
    car.jpg

    详细介绍地址:https://www.cirmall.com/bbs/thread-39422-1-1.html
    BPI-R1小车:https://www.cirmall.com/bbs/thread-39909-1-1.html

    BPI+L298N免单片机方案的照片:
    IMG_1595.jpg
    IMG_1596.jpg
    IMG_1607.jpg
    IMG_1608.jpg
    自己焊接了一个扩展板,里面将BPI和L298n用光耦隔离,有效保护自己BPI!!!关于光耦的电路大家百度吧,这里恕不赘述,先附上socket源代码:
    1. #include <stdio.h>
    2. #include <stdlib.h>

    3. #include <unistd.h>
    4. #include <errno.h>
    5. #include <string.h>
    6. #include <netdb.h>
    7. #include <sys/types.h>
    8. #include <time.h>
    9. #include <sys/socket.h>
    10. #include <arpa/inet.h>

    11. #include <wiringPi.h>

    12. #define BUFSIZE 512

    13. #define MOTOR_GO_FORWARD   digitalWrite(1,HIGH);digitalWrite

    14. (4,LOW);digitalWrite(5,HIGH);digitalWrite(6,LOW)
    15. #define MOTOR_GO_BACK           digitalWrite(4,HIGH);digitalWrite

    16. (1,LOW);digitalWrite(6,HIGH);digitalWrite(5,LOW)
    17. #define MOTOR_GO_RIGHT           digitalWrite(1,HIGH);digitalWrite

    18. (4,LOW);digitalWrite(6,HIGH);digitalWrite(5,LOW)
    19. #define MOTOR_GO_LEFT           digitalWrite(4,HIGH);digitalWrite

    20. (1,LOW);digitalWrite(5,HIGH);digitalWrite(6,LOW)
    21. #define MOTOR_GO_STOP           digitalWrite(1, LOW);digitalWrite

    22. (4,LOW);digitalWrite(5, LOW);digitalWrite(6,LOW)

    23. typedef struct CLIENT {
    24.         int fd;
    25.         struct sockaddr_in addr;
    26. }CLIENT;

    27. int main(int argc, char *argv[])
    28. {
    29.     int sockfd;
    30.     int listenfd;
    31.     int connectfd;

    32.     int ret;
    33.     int maxfd=-1;
    34.     struct timeval tv;

    35.     struct sockaddr_in server_addr;
    36.     struct sockaddr_in client_addr;

    37.     socklen_t len;
    38.     int portnumber;

    39.     char buf[BUFSIZE]={0xff,0x00,0x00,0x00,0xff};

    40.     int z,i,maxi = -1;
    41.     int k;
    42.     fd_set rset,allset;

    43.     CLIENT client[FD_SETSIZE];

    44.     /*RPI*/
    45.     wiringPiSetup();
    46.     /*WiringPi GPIO*/
    47.     pinMode (1, OUTPUT);        //IN1
    48.     pinMode (4, OUTPUT);        //IN2
    49.     pinMode (5, OUTPUT);        //IN3
    50.     pinMode (6, OUTPUT);        //IN4

    51.     pinMode (3, OUTPUT);        //beed


    52.     if(argc != 2)
    53.     {
    54.         printf("Please add portnumber!");
    55.         exit(1);
    56.     }

    57.     if((portnumber = atoi(argv[1]))<0)
    58.     {
    59.         printf("Enter Error!");
    60.         exit(1);
    61.     }


    62.     if((listenfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
    63.     {
    64.         printf("Socket Error!");
    65.         exit(1);
    66.     }


    67.     memset(&server_addr, 0, sizeof server_addr);
    68.     server_addr.sin_family = AF_INET;
    69.     server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    70.     server_addr.sin_port = htons(portnumber);


    71.     if((bind(listenfd, (struct sockaddr *)(&server_addr), sizeof

    72. server_addr)) == -1)
    73.     {
    74.         printf("Bind Error!");
    75.         exit(1);
    76.     }

    77.     if(listen(listenfd, 128) == -1)
    78.     {
    79.         printf("Listen Error!");
    80.         exit(1);
    81.     }

    82.     for(i=0;i<FD_SETSIZE;i++)
    83.     {
    84.         client[i].fd = -1;
    85.     }

    86.     FD_ZERO(&allset);
    87.     FD_SET(listenfd, &allset);

    88.     maxfd = listenfd;

    89.     printf("waiting for the client's request...\n");

    90.     while (1)
    91.     {
    92.         rset = allset;

    93.         tv.tv_sec = 1;      //wait 1 second
    94.         tv.tv_usec = 0;

    95.         ret = select(maxfd + 1, &rset, NULL, NULL, &tv);

    96.         if(ret == 0)
    97.             continue;
    98.         else if(ret < 0)
    99.         {
    100.             printf("select failed!");
    101.                    break;
    102.         }
    103.         else
    104.         {
    105.             if(FD_ISSET(listenfd,&rset)) // new connection
    106.             {
    107.                 len = sizeof (struct sockaddr_in);
    108.                 if((connectfd = accept(listenfd,(struct sockaddr*)

    109. (&client_addr),&len)) == -1)
    110.                 {
    111.                     printf("accept() error");
    112.                     continue;
    113.                 }

    114.                 for(i=0;i<FD_SETSIZE;i++)
    115.                 {
    116.                     if(client[i].fd < 0)
    117.                     {
    118.                         client[i].fd = connectfd;
    119.                         client[i].addr = client_addr;
    120.                         printf("Yout got a connection from %s

    121. \n",inet_ntoa(client[i].addr.sin_addr));
    122.                         break;
    123.                     }
    124.                 }

    125.                 if(i == FD_SETSIZE)
    126.                     printf("Overfly connections");

    127.                 FD_SET(connectfd,&allset);

    128.                 if(connectfd > maxfd)
    129.                     maxfd = connectfd;

    130.                 if(i > maxi)
    131.                     maxi = i;
    132.             }
    133.             else
    134.             {
    135.                 for(i=0;i<=maxi;i++)
    136.                 {
    137.                     if((sockfd = client[i].fd)<0)
    138.                         continue;

    139.                     if(FD_ISSET(sockfd,&rset))
    140.                     {
    141.                         bzero(buf,BUFSIZE + 1);
    142.                         if((z = read(sockfd,buf,sizeof buf)) > 0)
    143.                         {
    144.                             buf[z] = '\0';
    145.                             //printf("num = %d received data:%s

    146. \n",z,buf);

    147.                             for(k=0;k<z;k++)
    148.                                 printf("buf[%d]=%x\n",k,buf[k]);
    149.                             if(buf[1] == 0x00)
    150.                             {
    151.                                 switch(buf[2])
    152.                                 {
    153.                                     case 0x01:MOTOR_GO_FORWARD;

    154. printf("forward\n");break;
    155.                                     case 0x02:MOTOR_GO_BACK;   

    156. printf("back\n");break;
    157.                                     case 0x03:MOTOR_GO_LEFT;   

    158. printf("left\n");break;
    159.                                     case 0x04:MOTOR_GO_RIGHT;   

    160. printf("right\n");break;
    161.                                     case 0x00:MOTOR_GO_STOP;   

    162. printf("stop\n");break;
    163.                                     default: break;
    164.                                 }
    165.                                 digitalWrite(3, HIGH);
    166.                             }
    167.                             else
    168.                             {
    169.                                 digitalWrite(3, LOW);
    170.                             }
    171.                         }
    172.                         else
    173.                         {
    174.                             printf("disconnected by client!");
    175.                             close(sockfd);
    176.                             FD_CLR(sockfd,&allset);
    177.                             client[i].fd = -1;
    178.                         }
    179.                     }
    180.                 }
    181.             }
    182.         }
    183.     }
    184.     close(listenfd);
    185.     return 0;
    186. }

    复制代码
    编译的前提是安装了wiringPi库,编译方法:
    gcc carserver.c -o carserver -lwiringPi -lwiringPiDev

    执行:./carserver 9001(9001是控制端口号)

    好了,这样就可以控制小车了,大家可以写个脚本让这段服务程序自启动就OK了!!

    最后,看帖回复是一种美德!


    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-12-29 17:10:28 | 显示全部楼层
    看帖回复是一种美德,必须顶起!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2015-3-6 13:14
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-12-29 17:16:05 | 显示全部楼层
    小车玩得不错啊,还有调速嘛?软调?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-10-12 13:06
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2014-12-29 17:23:53 | 显示全部楼层
    当然可以调速,只是我还没试,等试过了,在发帖子!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-6-25 09:54
  • 签到天数: 216 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-12-29 17:46:33 | 显示全部楼层
    用STM32有点大材小用了。51其实都可以满足了……确实其实也没必要用单片机的,只是PWM输出要软件模拟耗点CPU而已
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-6-22 23:57
  • 签到天数: 943 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-12-29 18:56:00 | 显示全部楼层
    不错不错           
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-7 11:49
  • 签到天数: 2193 天

    连续签到: 33 天

    [LV.Master]伴坛终老

    发表于 2014-12-29 20:09:44 | 显示全部楼层
    顶一个!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-10-9 10:25
  • 签到天数: 886 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-12-29 22:20:55 | 显示全部楼层
    楼主分享也是一种美德!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-1-4 16:16:54 | 显示全部楼层
    看帖回复是一种美德!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-6-24 16:41
  • 签到天数: 709 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-1-5 21:23:28 | 显示全部楼层
    牛逼啊
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 20:55 , Processed in 0.214837 second(s), 34 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.