Σε αυτή τη δραστηριότητα θα συνδέσουμε το Huskylens με to arduino Uno και θα το προγραμματίσουμε να ακολουθεί μία μαύρη γραμμή.
Η Huskylens είναι μια κάμερα AI από την dfrobot.com . Έχει πολλά χαρακτηριστικά όπως αναγνώριση προσώπου, αναγνώριση αντικειμένων, παρακολούθηση αντικειμένων, αναγνώριση χρωμάτων, παρακολούθηση γραμμών. Μπορεί να εκπαιδευτεί μόνο με ένα κλικ στο κουμπί ή μερικές γραμμές κωδικών που υποστηρίζονται σε γλώσσα python, micropython και Arduino. Περισσότερα για το Huskylens.

Κατάλογος υλικών
- 1 Huskylens Σύνδεσμος
 - 1 Arduino Uno
 - 1 Πλακέτα οδήγησης κινητήρων. Εδώ χρησιμοποιήσαμε την Robot Shield for Arduino
 - 2 Κινητήρες DC, Εδω χρησιμοποιήσαμε το κιτ τανκ rover5 , αλλά μπορεί να χρησιμοποιήσετε οποιοδήποτε άλλο.
 
Σημείωση: Πριν ξεκινήσετε, πρέπει να γνωρίζετε για το Arduino και το Arduino IDE καθώς πρόκειται να χρησιμοποιήσουμε για τον προγραμματισμό του Arduino. Δείτε άλλα άρθρα σε αυτό το ιστολόγιο.
Σύνδεση κυκλώματος
- Πραγματοποιήστε όλες τις συνδέσεις όπως φαίνεται στο διάγραμμα κυκλώματος.
 

Ρυθμίστε στην κάμερα Huskylens το πρωτόκολλο σε I2C. Ακολουθήστε για λεπτομερείς οδηγίες: https://wiki.dfrobot.com/HUSKYLENS_V1.0_SKU_SEN0305_SEN0336.
Πιέστε δεξιά – αριστερά το αριστερό πλήκτρο και πιέστε το στην επιλογή “Line Tracking”, κατόπιν πατήστε το δεξιό πλήκτρο για να ξεκινήσετε την λειτουργία εκμάθησης γραμμής
Κώδικας
ΒΗΜΑ 1ο. Κατεβάστε την βιβλιοθήκη C Huskylens για το arduino
*Αντιγράψτε τον φακελο HUSKYLENS  μεσα στο φάκελο Library (C:\Users\user_name\Documents\Arduino\libraries\) .
ΒΗΜΑ 2 Κωδικός αναγνώρισης γραμμής
*Αντιγράψτε τον παρακάτω κώδικα σε ένα νέο έγγραφο στο arduino IDE
/***************************************************
 Created 2024-03-2
 By [S. Anagnostakis](sanagn@uoc.gr)
 This example shows the basic function of library for HUSKYLENS via I2c arduino on rover5 chasses.
***************************************************
 GNU Lesser General Public License.
 See <http://www.gnu.org/licenses/> for details.
 All above must be included in any redistribution
 ****************************************************/
/***********Notice and Trouble shooting***************
 1.Connection and Diagram can be found here
 <https://robolab.edc.uoc.gr/#....>
 2.This code is tested on Arduino Uno, boards.
 ****************************************************/
#include "HUSKYLENS.h"
//HUSKYLENS An Easy-to-use AI Machine Vision Sensor
//<https://www.dfrobot.com/product-1922.html>
// Motor A, Left Side  
const uint8_t motor_left_pwm = 6;// ENA - Enable and PWM  
const uint8_t motor_left_dir = 8;// 1Ainv2A - Forward / Reverse 
// Motor B, Right Side 
const uint8_t motor_right_pwm = 9;// ENA - Enable and PWM  
const uint8_t motor_right_dir = 7;// 3Ainv4A - Forward / Reverse 
int speed=80;
HUSKYLENS huskylens;
//HUSKYLENS green line >> SDA; blue line >> SCL
void printResult(HUSKYLENSResult result);
void setup() {
  // Setup motors
  pinMode(motor_left_pwm, OUTPUT);
  pinMode(motor_left_dir, OUTPUT);
  pinMode(motor_right_pwm, OUTPUT);
  pinMode(motor_right_dir, OUTPUT);
  Serial.begin(115200);
  Wire.begin();
  while (!huskylens.begin(Wire))
  {
    Serial.println(F("Begin failed!"));
    Serial.println(F("1.Please recheck the \"Protocol Type\" in HUSKYLENS (General Settings>>Protocol Type>>I2C)"));
    Serial.println(F("2.Please recheck the connection."));
    delay(100);
  }
}
void loop() {
  int32_t Rten; 
  int32_t Rdir;
  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);
    Rten = (int32_t)result.xTarget - (int32_t)160;  //160 είναι το μέσο Χ της κάμερας
    Rdir = (int32_t)result.xTarget;
    Serial.println(String()+"ένταση: "+Rten+", "+"κατέυθυνση: "+Rdir);
    if (Rdir > 170){
    //turn_right(100);
    int xtl=speed-abs(Rten);
    int xtr=speed+abs(Rten);
    if (xtl <0) xtl = 00;
    if (xtr > 200) xtr = 200; 
    move_tank(xtl, xtr);
    //delay(abs(Rten));
    //motor_stop();
    }
    else if (Rdir < 150){  //δεξιος τροχος
    //turn_left(100);
    int xtl=speed+abs(Rten);
    int xtr=speed-abs(Rten);
    if (xtl >200) xtl =200;
    if (xtr < 0) xtr = 0; 
    move_tank(xtl, xtr);
    //delay(abs(Rten));
    //motor_stop();
    }
    else if((Rdir >149) && (Rdir <171)) {
    drive_forward(speed);
    //delay(20);
    }
    else { 
    motor_stop();
    } 
    delay(10);   
  }
}
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!");
    }
}
void motor_stop(){
digitalWrite(motor_left_pwm, LOW);
digitalWrite(motor_right_pwm, LOW);
delay(25);
}
void drive_forward(int sf){
Serial.println(String()+"front= "+sf);
digitalWrite(motor_left_dir, HIGH);
analogWrite(motor_left_pwm, sf);
digitalWrite(motor_right_dir, HIGH);
analogWrite(motor_right_pwm, sf);
}
void drive_backward(int sb){
digitalWrite(motor_left_dir, HIGH);
analogWrite(motor_left_pwm, sb);
digitalWrite(motor_right_dir, HIGH);
analogWrite(motor_right_pwm, sb);
}
void turn_left(int sl){
Serial.println(String()+"left= "+sl);
digitalWrite(motor_left_dir, LOW);
analogWrite(motor_left_pwm, 0);
digitalWrite(motor_right_dir, LOW);
analogWrite(motor_right_pwm, sl);
}
void turn_right(int sr){
Serial.println(String()+"right= "+sr);
digitalWrite(motor_left_dir, LOW);
analogWrite(motor_left_pwm, sr);
digitalWrite(motor_right_dir, LOW);
analogWrite(motor_right_pwm, 0);
}
void move_tank(int sl, int sr){
Serial.println(String()+sl+" , "+sr);
digitalWrite(motor_left_dir, HIGH);
analogWrite(motor_left_pwm, sl);
digitalWrite(motor_right_dir, HIGH);
analogWrite(motor_right_pwm, sr);
}