#include "AccelStepper.h"
AccelStepper stepper1(1,4,2);
const byte LED = 13; //定义LED引脚为数字引脚13
const byte BUTTON5 = 5; //定义按钮引脚为数字引脚5
const byte BUTTON12 = 12;
int stopstale =0;
bool runstale = false;
int old_val = 0; //定义一个变量来存储按钮的上一次状态
int steps =30000;
int runon=0;
int runondate=0;
// 任务的句柄
TaskHandle_t motorTaskHandle;
TaskHandle_t commandTaskHandle;
// 任务一:控制电机
void motorTask(void *parameter)
{
// 设置电机的最大速度和加速度
stepper1.setMaxSpeed(2000);
stepper1.setAcceleration(2000);
while (true)
{
// 让电机运行到目标位置
stepper1.run();
// 延时一毫秒
vTaskDelay(1);
}
Serial2.println("Ending task 1");
//vTaskDelete(NULL);
}
// 任务二:接收指令
void commandTask(void *parameter)
{
// 用来存储指令的变量
int command = 0;
while (true)
{
// 从串口读取指令
if (Serial1.available() > 0)
{
command = Serial1.parseInt();
// 根据指令设置电机的目标位置
stepper1.moveTo(command);
}
if(digitalRead(BUTTON5)==1){
stepper1.move(steps);
}
if(digitalRead(BUTTON12)==1){
stepper1.stop();
// 延时一毫秒
vTaskDelay(1);
}
Serial2.println("Ending task 2");
//vTaskDelete(NULL);
}
}
//初始化设置
void setup() {
pinMode(LED, OUTPUT); //设置该引脚为输出模式
pinMode(BUTTON5, INPUT); //设置该引脚为输入模式
pinMode(BUTTON12, INPUT);
stepper1.setMaxSpeed(1000.0); // 1号电机最大速度500
stepper1.setAcceleration(2000.0); // 1号电机加速度50.0
//attachInterrupt(digitalPinToInterrupt(runstale), speedz, CHANGE);
//attachInterrupt(digitalPinToInterrupt(BUTTON12), speedr, CHANGE);
//xTaskCreate(task1,"task1",10000,NULL,1,NULL);
//任务函数*带有任务名称字符串* *堆栈大小,单位为字节* *作为任务输入参数传递* * * *任务优先级任务处理*
//xTaskCreate(task2,"task2",10000,NULL,2,NULL);
Serial.begin(9600);
// 创建任务一,分配给核心0
xTaskCreatePinnedToCore(
motorTask, // 任务函数
"Motor", // 任务名称
10000, // 堆栈大小
NULL, // 参数
6, // 优先级
&motorTaskHandle, // 任务句柄
0); // 核心编号
// 创建任务二,分配给核心1
xTaskCreatePinnedToCore(
commandTask, // 任务函数
"Command", // 任务名称
10000, // 堆栈大小
NULL, // 参数
5, // 优先级
&commandTaskHandle, // 任务句柄
1); // 核心编号
}
//循环
void loop() {
}
void speedr(){
if(runon!=0&&stopstale==true){
runon=runon-1;
}else{
runon=runondate;
}
stopstale=false;
}
/*
void task1(void*parameter)
{
while(1){
if(digitalRead(BUTTON5)==1){
stepper1.move(steps);
while(stepper1.distanceToGo() != 0){
stepper1.run();
}
}
}
}
//vTaskDelete(NULL);
void task2(void*parameter)
{
while(1)
{
if (digitalRead(BUTTON12)==1) {
stepper1.stop();
digitalWrite(LED, HIGH);
}else{
digitalWrite(LED, LOW);
}
}
//vTaskDelete(NULL);
}
*/
/*
#include <AccelStepper.h>
// 定义电机的步进数和引脚
#define MOTOR_STEPS 200
#define MOTOR_PIN1 2
#define MOTOR_PIN2 3
#define MOTOR_PIN3 4
#define MOTOR_PIN4 5
// 创建一个AccelStepper对象,使用FULL4WIRE模式
AccelStepper stepper = AccelStepper(FULL4WIRE, MOTOR_PIN1, MOTOR_PIN3, MOTOR_PIN2, MOTOR_PIN4);
// 定义一些常量和变量
const int BAUD_RATE = 9600; // 串口波特率
const int MAX_SPEED = 1000; // 电机的最大速度,单位为步/秒
const int ACCELERATION = 100; // 电机的加速度,单位为步/秒^2
String input = ""; // 用于存储串口接收到的字符串
void setup() {
// 初始化串口和电机
Serial.begin(BAUD_RATE);
stepper.setMaxSpeed(MAX_SPEED);
stepper.setAcceleration(ACCELERATION);
}
void loop() {
// 如果串口有可用数据,读取并存储到input变量中
if (Serial.available() > 0) {
input = Serial.readString();
input.trim(); // 去除字符串两端的空白字符
Serial.println("收到指令: " + input); // 打印收到的指令
}
// 如果input不为空,根据指令控制电机
if (input != "") {
if (input == "F") { // 如果指令为F,表示向前转动
stepper.setSpeed(MAX_SPEED); // 设置电机速度为最大速度
stepper.runSpeed(); // 运行电机
}
else if (input == "B") { // 如果指令为B,表示向后转动
stepper.setSpeed(-MAX_SPEED); // 设置电机速度为负的最大速度
stepper.runSpeed(); // 运行电机
}
else if (input == "S") { // 如果指令为S,表示停止转动
stepper.stop(); // 停止电机
stepper.runToPosition(); // 运行到停止位置
}
else { // 如果指令不是F、B或S,表示无效指令
Serial.println("无效指令,请输入F、B或S"); // 打印错误信息
}
input = ""; // 清空input变量,等待下一次接收指令
}
}
#include <Arduino.h>
#include <AccelStepper.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
// 电机的引脚
#define STEP_PIN 13
#define DIR_PIN 14
// 电机的对象
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
// 任务的句柄
TaskHandle_t motorTaskHandle;
TaskHandle_t commandTaskHandle;
// 串口的对象
HardwareSerial Serial1(1);
HardwareSerial Serial2(2);
// 任务一:控制电机
void motorTask(void *parameter)
{
// 设置电机的最大速度和加速度
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
while (true)
{
// 让电机运行到目标位置
stepper.run();
// 延时一毫秒
vTaskDelay(1);
}
Serial2.println("Ending task 1");
vTaskDelete(NULL);
}
// 任务二:接收指令
void commandTask(void *parameter)
{
// 用来存储指令的变量
int command = 0;
while (true)
{
// 从串口读取指令
if (Serial1.available() > 0)
{
command = Serial1.parseInt();
// 根据指令设置电机的目标位置
stepper.moveTo(command);
}
// 延时一毫秒
vTaskDelay(1);
}
Serial2.println("Ending task 2");
vTaskDelete(NULL);
}
void setup()
{
// 初始化串口
Serial1.begin(9600, SERIAL_8N1, 16, 17); // 串口1,用于接收指令
Serial2.begin(115200, SERIAL_8N1, 4, 5); // 串口2,用于打印信息
// 创建任务一,分配给核心0
xTaskCreatePinnedToCore(
motorTask, // 任务函数
"Motor", // 任务名称
10000, // 堆栈大小
NULL, // 参数
6, // 优先级
&motorTaskHandle, // 任务句柄
0); // 核心编号
// 创建任务二,分配给核心1
xTaskCreatePinnedToCore(
commandTask, // 任务函数
"Command", // 任务名称
10000, // 堆栈大小
NULL, // 参数
5, // 优先级
&commandTaskHandle, // 任务句柄
1); // 核心编号
}
void loop()
{
// 不需要在这里写任何代码
}
*/