首页-达尔闻    全部    【项目分享】奇怪!我的开发板能自动玩游戏

【项目分享】奇怪!我的开发板能自动玩游戏

Arduino在游戏界非常受欢迎,有很多小游戏的操控都可以用Arduino来实现。今天我们就分享两个简单好玩的小游戏制作。
收藏
  • Arduino在游戏界非常受欢迎,有很多小游戏的操控都可以用Arduino来实现。今天我们就分享两个简单好玩的小游戏制作。第一个游戏让我们热热身,先熟悉Arduino如何与电脑通信。第二游戏就有难度了,人工智能让Arduino 自动控制游戏。

    游戏一:恐龙版“马里奥”

    这个游戏不需要连接网络,在Chrome浏览器中就可以轻松玩起来。游戏的原理非常简单:

    Chrome浏览器中打开游戏界面,通过光敏电阻来检测手势的变化后将数据送给Arduino,Arduino经过处理判断后再发送指令给电脑上运行的python程序,通过程序里的pyautogui库就可以执行我们打游戏时所需要的动作啦!

     

    硬件上,Arduino检测到的手势代替键盘,检测手势变化可以用光敏电阻,超声波传感器或者红外传感器等等。

    大家注意到没,这个游戏只需要执行一个动作(跳跃),所以需要识别的动作只有1个,不需要特别复杂的识别传感器。如果你想为游戏增添更多的手势,比如左右移动或者开火等等,可以尝试使用APDS-9960手势识别模块或者自己搭建传感器阵列,达尔闻之前的推文有介绍。

     

     

    软件部分是游戏的重点,我们需要知道python如何与Arduino通信来获取指令。Python与Arduino通信的方式有很多,可以调用的库函数也非常多而且成熟。这里介绍一种最简单的方法,保证学电子的都能看懂且可以实现:

    首先在电脑上安装python3,然后以管理员身份打开CMD命令提示符并输入python所在目录

    cd C:\Python37

    输入以下命令来更新pip版本,方便进一步安装其他库函数

    python-m pip install --upgrade pip

     

    pip安装成功界面

    输入以下命令来安装pyautogui库

    pip install pyautogui

    在python编译器里输入以下代码就成功啦!代码非常简单,成熟的库函数帮助我们省去了很多底层配置的工作,相信你一定能看懂并实现的!

     

    # Serial library use to connect python3 and arduino
    import serial
    # pyautogui library will be use to perform "up" arrow function
    import pyautogui
    #Creates object of Serial class. You may need to change port name
    #Check your ardunio sketch in tools section to know port name
    arduino=serial.Serial('COM1', 9600)
    while1:   
      incoming_Data=arduino.readline()#readline() function will get data from serial monitor line by line   
    if'up'inincoming_Data.decode('utf-8'): #In python3 dataneeds to convert into byte so decode function is use for that       
    pyautogui.press('up')# function toperform up arrow functionality       
    #print("up")    
    incoming_Data=""
    # reinitialingincoming_Data to empty

     

    在arduino里烧录以下代码,一个简单的利用arduino打游戏的项目就完成啦!

    intldrValue=0;
    intthreshold=400;// Your threshold value may be different
    voidsetup() {
    // put your setup code here, to run once: 
    Serial.begin(9600);// Getting our serial monitor ready to be use by python3 pinMode(LED_BUILTIN,OUTPUT);// LED_BUILTIN means led on board connected with digital pin 13
    pinMode(A1,INPUT);
    //  ldr sensor is connected to analog pin A1}
    voidloop() {
    // put your main code here, to run repeatedly:
    ldrValue=analogRead(A1);
    // Takes values from ldr sensor
    // Serial.println(ldrValue);
    // To check which value fits best depending on room light intensity you use this function by uncommenting it 
    if(ldrValue>threshold) 
    {
       digitalWrite(LED_BUILTIN ,LOW );// So if ldrValue is greater than 400 threshold then do nothing led will be off  
    }
    else
      {      
       digitalWrite(LED_BUILTIN ,HIGH );
    // Otherwise Turn led ON and Sent "up" command to python3 Thats all !    Serial.println("up");   
    delay(500);// you may have to change this value because delay was use to sent only one "up" command otherwise it will send multiple commands. 
    }
    }
     

     

    怎么样,上位机和下位机的代码都非常简单吧。接下来便是一个有挑战的人工智能游戏!

     

    游戏二:会自己玩的XBOX

     

    文章开篇视频演示的就是会自己玩的XBOX,在硬件方面需要利用舵机设计一个机械操控手臂,这样arduino便可以直接控制XBOX上的摇杆。

     

    组装零件的3D文件可以在“达尔闻说”微信回复:Arduino游戏,获取。

     

    软件部分要借助游戏制作软件Unity和同样由Unity开发的ML-agents工具箱来帮助我们实现游戏制作和机器学习部分。

     

    ML-agents工具箱里有一些写好的游戏demo,其中一个是平衡球的游戏,我们可以在此基础上修改成为一个只需要操纵杆的游戏。

     

    在程序里,保留左摇杆的控制权来方便确认arduino与计算机之间的通信正常。

     

    根据程序开发自己的游戏版本,可以增加一定的游戏难度:

    1)在保持球不掉落的前提下增加一个需要靠近的目标

    2)在每局游戏开始时以随机速度沿随机方向投掷小球

    接下来便是重中之重,训练神经网络使其能够自己玩游戏:

     

    监督学习的训练过程大致步骤如下(感兴趣的可以查看源码,里面有已经training好的模型,在“达尔闻说”微信回复:Arduino游戏):

    1)AI在游戏里查看游戏的状态,即寻找球的位置速度以及平台的倾斜角度

    2)通过一定运算后进行决策,来移动摇杆的X轴还是Y轴

    3)根据结果来进行奖励或者惩罚,即球仍在平台上正得分,掉落负分

    然后不停循环重复这个过程,直到AI可以做出正确的决策。这里只是非常简单的概述,实际训练过程中的调参(层数,神经元数量等等)难度很大,感兴趣的同学可以在NN文件夹里找到训练好的模型。在Unity里导入工程后再修改 'control.cs' 脚本文件里的arduino端口后便可以在你电脑上运行啦!

     

    对于初学者或者没有人工智能方面基础的同学,可以先下载XBOX自动玩的项目下载研究一番。当然你也可以先试试第一个简单易实现游戏,体验游戏的快感!

    达尔闻专属星级判定

    实用系数:★★★★★

    难度系数:★★★★☆

    创新系数:★★★★☆

     

Control Render Error!ControlType:productSlideBind,StyleName:Style1,ColorName:Item0,Message:InitError, ControlType:productSlideBind Error:未将对象引用设置到对象的实例。