基于图灵的聊天控制机器人
本帖最后由 糖悦之果飞 于 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
下面是工程:
谢谢LZ分享:) Very good! Thanks a lot! 文章不错,记得一并发到我们的经验频道哟http://jingyan.eeboard.com/ 感谢分享。 需要连接网络使用,那他连接到哪个网了? 谢谢分享学习一下
页:
[1]