基于arduino的下位机,实现上位机的键盘操作

下位机代码

#include <Servo.h> 

Servo myservo;
String str;
int pos = 92; //舵机角度
int motor_pwm = 100; //电机数值0 ~255
int pos_mid = 92; // 储存舵机中值角度
int motorPin = 5;  // 确定motor控制引脚
int servoPin = 9;  //确定servo控制引脚

void setup() {
  Serial.begin(115200);
  myservo.attach(servoPin);  // 该舵机由arduino第9脚控制
  pinMode(motorPin, OUTPUT);  // 将电机引脚设为输出模式
  myservo.write(pos_mid);  // 舵机复位
  analogWrite(motorPin,0);   // 电机初始转动
  delay(1000);
}

void loop() {
  if (Serial.available() >= 2) {
    int servoValue = Serial.read();
    int motorValue = Serial.read();

    // 控制舵机
    myservo.write(servoValue);
    if (servoValue <40)  servoValue=40;
    else if(servoValue > 140) servoValue=140;

    Serial.print("servo: ");
    Serial.println(servoValue);
    // 控制电机
    
    if (motorValue <0)  motorValue=0;
    else if(motorValue > 255) motorValue=255;
    analogWrite(motorPin, motorValue);

    Serial.print("motor: ");
    Serial.println(motorValue);
  }   
}

上位机代码key_control.py

# Author: 无忧
# Date: 2023-12-02
# Description: 这是一个键盘控制的简单代码
# 请调节键盘状态为英语小写状态
# --------------------

import keyboard
import time
# 要下包keyboard
from send_M_S import *

speed = 0
speed_max = 60  # 速度的最大值
turn = 92  # 舵机中值
turn_l = 60  # 舵机打角最左
turn_r = 120  # 舵机打角最右

if __name__ == "__main__":
    ser = init_send()
    while True:
        try:
            if keyboard.is_pressed('w'):
                speed += 5
                if speed >= speed_max:
                    speed = speed_max
            elif keyboard.is_pressed('a'):
                turn -= 8
                if turn <= turn_l:
                    turn = turn_l
            elif keyboard.is_pressed('d'):
                turn += 8
                if turn >= turn_r:
                    turn = turn_r
            elif keyboard.is_pressed('s'):
                speed -= 5
                if speed <= 0:
                    speed = 0
            time.sleep(0.1)  # 系统响应速度
            send_values(ser, turn, speed)
        except KeyboardInterrupt:
            break

上位机代码send_M_S

# Author:
# Date: 2023-12-02
# Description: This script does XYZ.
import serial
import time
import sys

# 设置串口参数
def init_send():
    ser = serial.Serial('COM4', 115200, timeout=1)
    return ser

def send_values(ser, servo_value, motor_value):
    # 向串口发送舵机值和电机值
    time.sleep(0.1)
    ser.write(bytes([servo_value, motor_value]))
    while ser.in_waiting:
        arduino_feedback = ser.readline().decode()
        print("Arduino:", arduino_feedback)

if __name__ == '__main__':
    # 初始化串口
    ser = init_send()
    try:
        while True:
            for i in range(60, 120, 1):
                send_values(ser, i, 50)
            for i in range(120, 60, -1):
                send_values(ser, i, 50)
    except KeyboardInterrupt:
        # 在用户按下 Ctrl+C 时,关闭串口并退出程序
        ser.close()
        sys.exit()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值