Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2023:danield:skittles-sorter [2023/05/21 21:12]
dragos.gorgovan created
pm:prj2023:danield:skittles-sorter [2023/05/30 17:48] (current)
dragos.gorgovan [Software Design]
Line 9: Line 9:
 **Schema bloc** **Schema bloc**
  
-{{:​pm:​prj2023:​danield:​schema_bloc.png?800|}}+{{:​pm:​prj2023:​danield:​schema_pm12345.png?450|}}
 ===== Hardware Design ===== ===== Hardware Design =====
  
-<note tip> +Lista de piese
-Aici puneţi tot ce ţine de hardware design+- placa ARDUINO UNO 
-  * listă de piese +buton 
-  * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://​www.captain.at/​electronic-atmega16-mmc-schematic.png) +led RGB 
-  * diagrame ​de semnal ​ +senzor de miscare cu infrarosu adafruit 2168 
-  * rezultatele simulării +servomotor 360 
-</​note>​+- senzor ​de culoare TCS 230 
 +- fire
  
 +{{:​pm:​prj2023:​danield:​circuit_6969.jpg?​500|}}
 ===== Software Design ===== ===== Software Design =====
  
Line 31: Line 33:
 </​note>​ </​note>​
  
 +Biblioteci:
 +- Servo.h pentru controlul servomotorului
 +
 +<​hidden>​
 +Cod sursa:
 +
 +#include "​usart.h"​
 +
 +#include <​Servo.h>​
 +
 +#define BUTTON2 3
 +
 +#define BUTTON 12
 +
 +#define SERVO 11
 +
 +#define MOTION 10
 +
 +#define S0 4
 +
 +#define S2 6
 +
 +#define S3 7
 +
 +#define sensorOut 8
 +
 +#define maxColors 20
 +
 +#define noReads 10
 +
 +#define BLUE 13
 +
 +#define GREEN 9
 +
 +#define RED 5
 +
 +#define EPS 7
 +
 +struct color {
 +  int r;
 +  int g;
 +  int b;
 +};
 +
 +Servo myservo;
 +volatile bool flag = false;
 +int redFrequency = 0;
 +int greenFrequency = 0;
 +int blueFrequency = 0;
 +color black_list[maxColors];​
 +int size = 0;
 +volatile int state = 0;
 +unsigned long last_rotation = 0;
 +int min_r = 100000, min_g = 100000, min_b = 100000;
 +int max_r = 0, max_g = 0, max_b = 0;
 +
 +
 +ISR (PCINT0_vect) {
 +  if (!digitalRead(MOTION)) {
 +    flag = true;
 +  }
 +}
 +
 +void setMode()
 +{
 +  if (state == 0)  ​
 +    state = 1;
 +}
 +
 +color read_color()
 +{
 +  color ret;
 +  ret.r = 0;
 +  ret.g = 0;
 +  ret.b = 0;
 +
 +  for (int i = 0; i < noReads; i++)
 +  {
 +    digitalWrite(S2,​LOW);​
 +    digitalWrite(S3,​LOW);​
 +    ​
 +    // Reading the output frequency
 +    ret.r += pulseIn(sensorOut,​ LOW);
 +    ​
 +    // Setting GREEN (G) filtered photodiodes to be read
 +    digitalWrite(S2,​HIGH);​
 +    digitalWrite(S3,​HIGH);​
 +    ​
 +    // Reading the output frequency
 +    ret.g += pulseIn(sensorOut,​ LOW);
 +  ​
 +    // Setting BLUE (B) filtered photodiodes to be read
 +    digitalWrite(S2,​LOW);​
 +    digitalWrite(S3,​HIGH);​
 +    ​
 +    // Reading the output frequency
 +    ret.b += pulseIn(sensorOut,​ LOW);
 +    delay(10);
 +  }
 +
 +  ret.r /= noReads;
 +  ret.g /= noReads;
 +  ret.b /= noReads;
 +
 +    Serial.print("​R:​ ");
 +    Serial.println(ret.r);​
 +    Serial.print("​G:​ ");
 +    Serial.println(ret.g);​
 +    Serial.print("​B:​ ");
 +    Serial.println(ret.b);​
 +
 +    if (ret.r > max_r)
 +      max_r = ret.r;
 +
 +    if (ret.r < min_r)
 +      min_r = ret.r;
 +    ​
 +    if (ret.g > max_g)
 +      max_g = ret.g;
 +
 +    if (ret.g < min_g)
 +      min_g = ret.g;
 +
 +    if (ret.b > max_b)
 +      max_b = ret.b;
 +
 +    if (ret.b < min_b)
 +      min_b = ret.b;
 +
 +    int redColor = map(ret.r, min_r, max_r, 255,0);
 +    analogWrite(RED,​ redColor);
 +
 +    int blueColor = map(ret.b, min_b, max_b, 255,0);
 +    analogWrite(BLUE,​ blueColor);
 +
 +    int greenColor = map(ret.g, min_g, max_g, 255,0);
 +    analogWrite(GREEN,​ greenColor);​
 +
 +  return ret;
 +}
 +
 +void setup()
 +{
 +  USART0_init();​
 +  Serial.begin(9600);​
 +  USART0_print("​Hello\n"​);​
 +
 +  pinMode(BUTTON,​ 2);
 +  pinMode(BUTTON2,​ 2);
 +  pinMode(S0, OUTPUT);
 +  pinMode(S2, OUTPUT);
 +  pinMode(S3, OUTPUT);
 +
 +  pinMode(RED,​ OUTPUT);
 +  pinMode(GREEN,​ OUTPUT);
 +  pinMode(BLUE,​ OUTPUT);
 +  analogWrite(RED,​0);​
 +  analogWrite(GREEN,​0);​
 +  analogWrite(BLUE,​0);​
 +
 +
 +  pinMode(MOTION,​ INPUT_PULLUP);​
 +
 +  // freq scaling 20%
 +  digitalWrite(S0,​HIGH);​
 +
 +  myservo.attach(SERVO);​
 +
 +
 +  attachInterrupt(digitalPinToInterrupt(BUTTON2),​ setMode, FALLING);
 +  PCICR |= B00000001; // We activate the interrupts of the PB port
 +  PCMSK0 |= B00000100; // PB2
 +}
 +
 +void loop()
 +{
 +  if (flag)
 +  {
 +    flag = false;
 +    delay(2000);​
 +    color temp = read_color();​
 +
 +    if (state == 1 && size < maxColors)
 +    {
 +      black_list[size].r = temp.r;
 +      black_list[size].g = temp.g;
 +      black_list[size].b = temp.b;
 +      size++;
 +      state = 0;
 +      myservo.write(110);​
 +      delay(1200);​
 +      myservo.write(90);​
 +    }
 +    else
 +    {
 +      bool blist = false;
 +      for (int i = 0; i < size; i++)
 +      {
 +        if ((black_list[i].r- temp.r) * (black_list[i].r- temp.r) + (black_list[i].b - temp.b) * (black_list[i].b - temp.b)
 +           + (black_list[i].g- temp.g) * (black_list[i].g- temp.g) <= EPS * EPS)
 +          blist = true;
 +      }
 +
 +      if (millis() - last_rotation > 2000)
 +      {
 +        last_rotation = millis();
 +
 +        if (blist)
 +        {
 +          myservo.write(110);​
 +          delay(1200);​
 +          myservo.write(90);​
 +        }
 +        else
 +        {
 +          myservo.write(70);​
 +          delay(1200);​
 +          myservo.write(90);​
 +        }
 +      }      ​
 +    }
 +  }
 +}
 +</​hidden>​
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
pm/prj2023/danield/skittles-sorter.1684692722.txt.gz · Last modified: 2023/05/21 21:12 by dragos.gorgovan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0