——qsj 发表于 2016-3-7 12:39:42

基于图灵的聊天控制机器人

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

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

      @Override
      protected void onCreate(Bundle savedInstanceState)
      {
                super.onCreate(savedInstanceState);
                requestWindowFeature(Window.FEATURE_NO_TITLE);
                setContentView(R.layout.main_chatting);
                initView();
                mAdapter = new ChatMessageAdapter(this, mDatas);
                mChatView.setAdapter(mAdapter);

      }

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

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

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

                mAdapter.notifyDataSetChanged();
                mChatView.setSelection(mDatas.size() - 1);
                //mMsg.setText("");
                if(mMsg.getText().toString().contains("AG")){
                        ChatMessage from = new ChatMessage(Type.INPUT, "包含G");
            mDatas.add(from);
                        mAdapter.notifyDataSetChanged();
                        mChatView.setSelection(mDatas.size() - 1);
                }
               
                if(mMsg.getText().toString().contains("oled")){
                        startPWM();
                        ChatMessage from = new ChatMessage(Type.INPUT, "oled开启");
            mDatas.add(from);
                        mAdapter.notifyDataSetChanged();
                        mChatView.setSelection(mDatas.size() - 1);
                }
               
                if(mMsg.getText().toString().contains("跑马灯")){
                        ChatMessage from = new ChatMessage(Type.INPUT, "跑马灯开启");
            mDatas.add(from);
                        mAdapter.notifyDataSetChanged();
                        mChatView.setSelection(mDatas.size() - 1);
                        Intent intent = new Intent(MainActivity.this, LhbForI2c.class);
                startService(intent);
                }
               
                if(mMsg.getText().toString().equals("GPIO")) {
                        // 关闭软键盘
                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        // 得到InputMethodManager的实例
                        if (imm.isActive())
                        {
                              // 如果开启
                              imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
                                                InputMethodManager.HIDE_NOT_ALWAYS);
                              // 关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的
                        }
                        
                        GPIO gpio = new GPIO();
                        int [] gpioPort = { 84, 83, 82, 76, 78, 80, 81, 79 };
            gpio.setmode(GPIO.BCM);
            for(int i = 0; i < 8; i++)
            {
                gpio.setup(gpioPort[ i ], GPIO.OUTPUT);
            }
            if(flagag == 1) {
                        flagag = 0;
                } else {
                        flagag = 1;
                }
            for(int i = 0; i < 8; i++)
            {
                gpio.output(gpioPort[ i ], flagag);
            }
            ChatMessage from = new ChatMessage(Type.INPUT, "开启成功");
            mDatas.add(from);
                        mAdapter.notifyDataSetChanged();
                        mChatView.setSelection(mDatas.size() - 1);
                } else {
                        // 关闭软键盘
                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        // 得到InputMethodManager的实例
                        if (imm.isActive())
                        {
                              // 如果开启
                              imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
                                                InputMethodManager.HIDE_NOT_ALWAYS);
                              // 关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的
                        }
                        new Thread()
                        {
                              public void run()
                              {
                                        ChatMessage from = null;
                                        try
                                        {
                                                from = HttpUtils.sendMsg(msg);
                                        } catch (Exception e)
                                        {
                                                from = new ChatMessage(Type.INPUT, "有网络我才会变得聪明");
                                        }
                                        Message message = Message.obtain();
                                        message.obj = from;
                                        mHandler.sendMessage(message);
                              };
                        }.start();
                        
                }
      }
      
      privatestatic float dutyCycle = 500;
    privatestatic float frequency = 500;
    privateint dr = 0;
   
      private void startPWM(){
      new Thread(new Runnable() {
            @Override
            public void run() {
                int channel=10;
                int channelCompare=11;
                float f=1.0f;
                GPIO gpio=new GPIO();
                gpio.setmode(GPIO.BCM);
                gpio.setup(channel, GPIO.OUTPUT);
                gpio.setup(channelCompare,GPIO.OUTPUT);
                PWM pwm=gpio.PWM(channel,f);
                PWM pwmCom=gpio.PWM(channelCompare,f);
                pwm.start(30.0f);
                pwmCom.start(50.0f);
                pwm.ChangeDutyCycle(dutyCycle);
                pwm.ChangeFrequency(frequency);
            }
      }).start();
    }外接LED引脚 使用: 使用了PWM接口   分别是J3 的 26 和 33 脚

下面是Genymotion调试的截图:

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

利用指令控制硬件功能

开启pwm呼吸灯 指令:oled


下面是工程:




jialichuang 发表于 2018-8-13 10:44:02

谢谢LZ分享:)

Frank100_301861 发表于 2018-6-30 17:56:33

Very good! Thanks a lot!

糖悦之果飞 发表于 2016-3-9 13:28:47

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

yanhaijian 发表于 2016-3-8 08:42:40

感谢分享。

油炸冰激凌 发表于 2016-3-8 07:53:05

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

suoma 发表于 2016-3-7 23:35:04

谢谢分享学习一下
页: [1]
查看完整版本: 基于图灵的聊天控制机器人

Baidu
map