6回答

0收藏

[原创] 基于图灵的聊天控制机器人

#拆解/开源硬件 #拆解/开源硬件 5027 人阅读 | 6 人回复 | 2016-03-07

本帖最后由 糖悦之果飞 于 2016-3-23 14:07 编辑

这几天搞了一下,主要是安卓平台的东西,结合了官网的android.jar包,可以让安卓直接来控制硬件。可玩性将大大加强。拿来玩耍是最合适不过的了。
搭载的外围器件: HDMI显示器(三星) 华硕鼠标usb 3.3V草帽LED
实现的功能:人机交互 聊天 信息查询 通过指令对硬件进行控制 跑马灯 PWM呼吸灯
先看一下代码时间,具体的工程,jar布置官网都用。
主函数实现了聊天,硬件控制 有一些固定指令。需要网络。
  1. /**
  2.          * 展示消息的listview
  3.          */
  4.         private ListView mChatView;
  5.         /**
  6.          * 文本域
  7.          */
  8.         private EditText mMsg;
  9.         /**
  10.          *存储聊天消息
  11.          */
  12.         private List<ChatMessage> mDatas = new ArrayList<ChatMessage>();
  13.         /**
  14.          *适配器
  15.          */
  16.         private ChatMessageAdapter mAdapter;
  17.         /**/
  18.         int flagag = 1;
  19.         
  20.         private Handler mHandler = new Handler()
  21.         {
  22.                 public void handleMessage(android.os.Message msg)
  23.                 {
  24.                         ChatMessage from = (ChatMessage) msg.obj;
  25.                         mDatas.add(from);
  26.                         mAdapter.notifyDataSetChanged();
  27.                         mChatView.setSelection(mDatas.size() - 1);
  28.                 };
  29.         };

  30.         @Override
  31.         protected void onCreate(Bundle savedInstanceState)
  32.         {
  33.                 super.onCreate(savedInstanceState);
  34.                 requestWindowFeature(Window.FEATURE_NO_TITLE);
  35.                 setContentView(R.layout.main_chatting);
  36.                 initView();
  37.                 mAdapter = new ChatMessageAdapter(this, mDatas);
  38.                 mChatView.setAdapter(mAdapter);

  39.         }

  40.         private void initView()
  41.         {
  42.                 mChatView = (ListView) findViewById(R.id.id_chat_listView);
  43.                 mMsg = (EditText) findViewById(R.id.id_chat_msg);
  44.                 mDatas.add(new ChatMessage(Type.INPUT, "测试开始"));
  45.         }

  46.         public void sendMessage(View view)
  47.         {
  48.                 final String msg = mMsg.getText().toString();
  49.                 if (TextUtils.isEmpty(msg))
  50.                 {
  51.                         Toast.makeText(this, "您还没有填写信息呢...", Toast.LENGTH_SHORT).show();
  52.                         return;
  53.                 }

  54.                 ChatMessage to = new ChatMessage(Type.OUTPUT, msg);
  55.                 to.setDate(new Date());
  56.                 mDatas.add(to);

  57.                 mAdapter.notifyDataSetChanged();
  58.                 mChatView.setSelection(mDatas.size() - 1);
  59.                 //mMsg.setText("");
  60.                 if(mMsg.getText().toString().contains("AG")){
  61.                         ChatMessage from = new ChatMessage(Type.INPUT, "包含G");
  62.             mDatas.add(from);
  63.                         mAdapter.notifyDataSetChanged();
  64.                         mChatView.setSelection(mDatas.size() - 1);
  65.                 }
  66.                
  67.                 if(mMsg.getText().toString().contains("oled")){
  68.                         startPWM();
  69.                         ChatMessage from = new ChatMessage(Type.INPUT, "oled开启");
  70.             mDatas.add(from);
  71.                         mAdapter.notifyDataSetChanged();
  72.                         mChatView.setSelection(mDatas.size() - 1);
  73.                 }
  74.                
  75.                 if(mMsg.getText().toString().contains("跑马灯")){
  76.                         ChatMessage from = new ChatMessage(Type.INPUT, "跑马灯开启");
  77.             mDatas.add(from);
  78.                         mAdapter.notifyDataSetChanged();
  79.                         mChatView.setSelection(mDatas.size() - 1);
  80.                         Intent intent = new Intent(MainActivity.this, LhbForI2c.class);
  81.                 startService(intent);
  82.                 }
  83.                
  84.                 if(mMsg.getText().toString().equals("GPIO")) {
  85.                         // 关闭软键盘
  86.                         InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  87.                         // 得到InputMethodManager的实例
  88.                         if (imm.isActive())
  89.                         {
  90.                                 // 如果开启
  91.                                 imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
  92.                                                 InputMethodManager.HIDE_NOT_ALWAYS);
  93.                                 // 关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的
  94.                         }
  95.                         
  96.                         GPIO gpio = new GPIO();
  97.                         int [] gpioPort = { 84, 83, 82, 76, 78, 80, 81, 79 };
  98.             gpio.setmode(GPIO.BCM);
  99.             for(int i = 0; i < 8; i++)
  100.             {
  101.                 gpio.setup(gpioPort[ i ], GPIO.OUTPUT);
  102.             }
  103.             if(flagag == 1) {
  104.                         flagag = 0;
  105.                 } else {
  106.                         flagag = 1;
  107.                 }
  108.             for(int i = 0; i < 8; i++)
  109.             {
  110.                 gpio.output(gpioPort[ i ], flagag);
  111.             }
  112.             ChatMessage from = new ChatMessage(Type.INPUT, "开启成功");
  113.             mDatas.add(from);
  114.                         mAdapter.notifyDataSetChanged();
  115.                         mChatView.setSelection(mDatas.size() - 1);
  116.                 } else {
  117.                         // 关闭软键盘
  118.                         InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  119.                         // 得到InputMethodManager的实例
  120.                         if (imm.isActive())
  121.                         {
  122.                                 // 如果开启
  123.                                 imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
  124.                                                 InputMethodManager.HIDE_NOT_ALWAYS);
  125.                                 // 关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的
  126.                         }
  127.                         new Thread()
  128.                         {
  129.                                 public void run()
  130.                                 {
  131.                                         ChatMessage from = null;
  132.                                         try
  133.                                         {
  134.                                                 from = HttpUtils.sendMsg(msg);
  135.                                         } catch (Exception e)
  136.                                         {
  137.                                                 from = new ChatMessage(Type.INPUT, "有网络我才会变得聪明");
  138.                                         }
  139.                                         Message message = Message.obtain();
  140.                                         message.obj = from;
  141.                                         mHandler.sendMessage(message);
  142.                                 };
  143.                         }.start();
  144.                         
  145.                 }
  146.         }
  147.         
  148.         private  static float dutyCycle = 500;
  149.     private  static float frequency = 500;
  150.     private  int dr = 0;
  151.    
  152.         private void startPWM(){
  153.         new Thread(new Runnable() {
  154.             @Override
  155.             public void run() {
  156.                 int channel=10;
  157.                 int channelCompare=11;
  158.                 float f=1.0f;
  159.                 GPIO gpio=new GPIO();
  160.                 gpio.setmode(GPIO.BCM);
  161.                 gpio.setup(channel, GPIO.OUTPUT);
  162.                 gpio.setup(channelCompare,GPIO.OUTPUT);
  163.                 PWM pwm=gpio.PWM(channel,f);
  164.                 PWM pwmCom=gpio.PWM(channelCompare,f);
  165.                 pwm.start(30.0f);
  166.                 pwmCom.start(50.0f);
  167.                 pwm.ChangeDutyCycle(dutyCycle);
  168.                 pwm.ChangeFrequency(frequency);
  169.             }
  170.         }).start();
  171.     }
复制代码
外接LED引脚 使用: 使用了PWM接口   分别是J3 的 26 和 33 脚

下面是Genymotion调试的截图:

在Genymotion只能调试聊天内容硬件驱动只能在板子上实现。
下面是部署到板子上的运行情况:

利用指令控制硬件功能

开启pwm呼吸灯 指令:oled


下面是工程:
go_rebot.rar (1.8 MB, 下载次数: 15)





分享到:
回复

使用道具 举报

回答|共 6 个

倒序浏览

沙发

suoma

发表于 2016-3-7 23:35:04 | 只看该作者

谢谢分享学习一下
板凳

油炸冰激凌

发表于 2016-3-8 07:53:05 | 只看该作者

需要连接网络使用,那他连接到哪个网了?
地板

yanhaijian

发表于 2016-3-8 08:42:40 | 只看该作者

感谢分享。
5#

糖悦之果飞

发表于 2016-3-9 13:28:47 | 只看该作者

文章不错,记得一并发到我们的经验频道哟http://jingyan.eeboard.com/
6#

Frank100_3018615

发表于 2018-6-30 17:56:33 | 只看该作者

Very good! Thanks a lot!
7#

jialichuang

发表于 2018-8-13 10:44:02 | 只看该作者

谢谢LZ分享
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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