Hi All -
I am just getting started and have connected two motors with encoders to the core2. You can see the specs on the motors I am using: here. I have connected the encoders as follows:
signal | Motor pin | core2 pin |
---|---|---|
V+ | 6 | 4 |
Gnd | 5 | 3 |
EncB | 4 | 5 |
EncA | 3 | 6 |
Here is the code I am using (which is very much based on example code):
#include “hFramework.h”
#include “hCloudClient.h”void cfgHandler()
{
platform.ui.loadHtml({Resource::URL, “/ui.html”});
}hPIDRegulator myReg;
void setupMotorPID()
{
float kp = 5;
float ki = 0.02;
float kd = 100.0;// hPID
myReg.setScale(1);
myReg.setKP(kp);
myReg.setKI(ki);
myReg.setKD(kd);
// hRegulator
myReg.dtMs = 5;
myReg.stableRange = 30;
myReg.stableTimes = 3;hMotB.attachPositionRegulator(myReg);
hMotB.resetEncoderCnt();
}void cloudTask() {
// sys.delay(5000); //necessary to boot CORE2-ROS (with ASUS Tinker Board), for CORE2 can be commented
platform.begin(&RPi);
//platform.ui.setProjectId(“@@@PROJECT_ID@@@”);
platform.ui.setProjectId(“0c8c31995442bca0”);
platform.ui.configHandler = cfgHandler;platform.ui.onKeyEvent = (KeyEventType type, KeyCode code) {
if (type == KeyEventType::Pressed) {
if (code == KeyCode::Key_A) {
platform.ui.label(“lb_enc”).setText(“%d”, hMotB.getEncoderCnt());
hMotB.rotRel(90, 100); // rotate DC motor with encoder
platform.ui.label(“lb_enc”).setText(“%d”, hMotB.getEncoderCnt());
}
if (code == KeyCode::Key_Z) {
hMotB.rotRel(0, 0); // rotate DC motor with encoder
LED2.toggle();
}
}
};while (1) {
sys.delay(500);
LED3.toggle();
auto lb1 = platform.ui.label(“l1”);
lb1.setText(“uptime %u”, sys.getRefTime());
auto lb_enc = platform.ui.label(“lb_enc”);
platform.ui.label(“lb_enc”).setText(“%d”, hMotB.getEncoderCnt());
}
}void hMain()
{
sys.taskCreate(cloudTask);setupMotorPID();
while (1) { sys.delay(250); LED1.toggle();
}
}
Pressing the ‘A’ and ‘Z’ keys will make the motor stop and start, as expected, but it doesn’t seem like the encoders are being read by the software. I would expect the motor to just turn a short distance and then stop, as I am using hMotB.rotrel(). Occasionally, the encoder count on the screen just goes to some large value, like 655360 or 131072, and stays there, so there is something being sensed from the encoder.
Am I missing something conceptually? Or do I have some parameters set wrong for the PID?
Any help getting me started would be appreciated.
Thanks
John