HUSKYLENSGeneral

Huskylens with Arduino - odd servo behavior

userHead anonymous 2020-09-21 05:08:19 4543 Views4 Replies
Hi!

I'm working on adapting GS-9018 servos to build pan-tilt mechanism for Huskylens. I'm using the basic example (HUSKYLENS_GET_STARED.ino) and added servo support by including Servo library.

The moment I initialize the servos (mysevo.attach), the PWM output starts to quickly rotate the servos in a very "shaky" manner towards one direction. My current code does not do anything with the PWM outputs. I anticipate it's the Huskylens library, since everytime a face is recognized, the servos return to default position. Only the PWM outputs I initialize in the code cause this.

If I upload some basic servo example, evertyhing works fine - the servos follow the instructions and stay still if nothing is being sent. I'm using Arduino Micro, digital PWM outputs, Huskylens in Serial 9600 mode via softserial and an external power supply. FW 4.7 (Stable, with models). What could be the problem? What is the reason the PWM outputs start to control the servos without any instructions in my code?
2020-10-27 20:49:11 I didn't have these servo issues and to be honest I don't know much about coding so I could definitely be way off here but last night when I tried to serial monitor the (HUSKYLENS_GET_STARED.ino) The serial monitor only showed basically backwards question marks and other non-identifiable characters. Even after I verified I was on 9600 protocol about 5 times. Finally in the program I changed the "Serial.begin(115200)" to "Serial.begin(9600)" and it worked perfectly fine. I started getting the correct feedback on the serial monitor. Not sure if this is somehow related to the servo but yeah. userHeadPic nonnie1026
2020-09-27 03:34:45 Hi!

It's basically the example code delivered with the library. The only thing I added is Servo library declaration and servo initialization. No servo movement commands yet. That's enought for the problem to appear. Marked changes to the example with "//<---".
Code: Select all
#include "HUSKYLENS.h"
#include "SoftwareSerial.h"
#include <Servo.h>                    //<---

Servo myServo1;                       //<---

HUSKYLENS huskylens;
SoftwareSerial mySerial(10, 11); // RX, TX
void printResult(HUSKYLENSResult result);

void setup() {
    Serial.begin(115200);
    mySerial.begin(9600);
    myServo1.attach(5);              //<---
    while (!huskylens.begin(mySerial))
    {
        Serial.println(F("Begin failed!"));
        Serial.println(F("1.Please recheck the \"Protocol Type\" in HUSKYLENS (General Settings>>Protocol Type>>Serial 9600)"));
        Serial.println(F("2.Please recheck the connection."));
        delay(100);
    }
}

void loop() {
    huskylens.request();
    if (!huskylens.request()) Serial.println(F("Fail to request data from HUSKYLENS, recheck the connection!"));
    else if(!huskylens.isLearned()) Serial.println(F("Nothing learned, press learn button on HUSKYLENS to learn one!"));
    else if(!huskylens.available()) Serial.println(F("No block or arrow appears on the screen!"));
    else
    {
        Serial.println(F("###########"));
        while (huskylens.available())
        {
            HUSKYLENSResult result = huskylens.read();
            printResult(result);
        }    
    }
}

void printResult(HUSKYLENSResult result){
    if (result.command == COMMAND_RETURN_BLOCK){
        Serial.println(String()+F("Block:xCenter=")+result.xCenter+F(",yCenter=")+result.yCenter+F(",width=")+result.width+F(",height=")+result.height+F(",ID=")+result.ID);
    }
    else if (result.command == COMMAND_RETURN_ARROW){
        Serial.println(String()+F("Arrow:xOrigin=")+result.xOrigin+F(",yOrigin=")+result.yOrigin+F(",xTarget=")+result.xTarget+F(",yTarget=")+result.yTarget+F(",ID=")+result.ID);
    }
    else{
        Serial.println("Object unknown!");
    }
}
userHeadPic anonymous
2020-09-22 02:44:03 So far I have managed to identify that it is the request() function that is causing this behavior. If I remove the huskylens.request() call from the code, the odd behavior of servos stops. Of course now the communication with Huskylens does not work anymore.

request function has rather compact body:
protocolWriteRequest();
return processReturn();

Unfortunately I'm not able to locate protocolWriteRequest() function body, so this is the point I'm stuck at. Any hints appreciated. :)

EDIT: Solved (or rather went around it) by moving to I2C. Still, would love to understand what the problem is. :)
userHeadPic anonymous