[Solved]Driving a single servo
-
using the M5 with firmware 1.2.3en and arduino 1.8.9
I know you can't use servo.h, so I came up with a work around, or at least I thought I did.
I cannot have M5.begin(); in the code or the servo doesn't work, without that the servo works but I cannot write to display.
Is there a solution? here's the example code;#include <M5Stack.h>
#define servoPin 5
int i = 0;
int servoPulse(int angle) {
int pulseWidth = map(angle, 0, 180, 544, 2400);
return pulseWidth;
}void setup() {
m5.begin(); Serial.begin(9600); pinMode(servoPin, OUTPUT);
}
void loop() {
for (int i=0; i<=180; i++) { // drive servo from 0 to 180 at max response
int pulseWidth = servoPulse(i);
//digitalWrite(servoPin, HIGH);
delayMicroseconds(pulseWidth);
//digitalWrite(servoPin, LOW);
delayMicroseconds(20000 - pulseWidth);
Serial.print(i);
}for (int i=180; i>=0; i--) { // return to 0 at half speed
int pulseWidth = servoPulse(i);
//digitalWrite(servoPin, HIGH);
delayMicroseconds(pulseWidth);
//digitalWrite(servoPin, LOW);
// delayMicroseconds(20000 - pulseWidth);
delay(50);
Serial.print(i);
}}
-
Hi, Please try to comment out this line -> Serial.begin(9600);
Thank you!
-
(Already set to serial speed 115200 in M5.begin () function)
-
I was hoping that it would be that simple, however, that wasn't the solution.
I cannot use M5.Lcd.print and the servo at the same time.
-
What device are you using?
I use G21 which is also SDA on port A -
I'm using an M5stack Core with the accelerometer built in, and arduino 1.8.9
This problem occurs when using M5.begin(); which I apparently need to print to lcd inside the loop.
So for instance, inside the loop,
M5.Lcd.setCursor(0, 200);
M5.lcd.setTextColor(WHITE,BLACK);
M5.Lcd.print (i);The Servo will not work, but instead chatter.
// M5.begin(); servo works but the display does not (this statement is inside the setup, for example,void setup() {
M5.begin();
//myservo.attach(servoPin);
}
-
@jimw Please try this code.
Serial speed 115200and the firmware (1.2.3-en) for micropython
It is not for Arduino.#include <M5Stack.h> int servoPin = 5; void servoSet(int Angle, int Time) { int pulseWidth; int TimeCount; TimeCount = Time / 20; for (int i = 0; i <= TimeCount; i++) { pulseWidth = map(Angle, 0, 180, 544, 2400); digitalWrite(servoPin, HIGH); delayMicroseconds(pulseWidth); digitalWrite(servoPin, LOW); delayMicroseconds(20000 - pulseWidth); } } void setup() { M5.begin(); M5.Lcd.printf("M5Stack Servo test:\n"); pinMode(servoPin, OUTPUT); } void loop() { M5.Lcd.printf("Angle 45deg\n"); Serial.println("Angle 45deg"); servoSet(45, 1000); //45deg M5.Lcd.printf("Angle 135deg\n"); Serial.println("Angle 135deg"); servoSet(135, 1000); //135deg }