ዝርዝር ሁኔታ:

በምልክት ዳሳሽ የኒዮፒክስል መሪ ቀለበትን መቆጣጠር -3 ደረጃዎች (ከስዕሎች ጋር)
በምልክት ዳሳሽ የኒዮፒክስል መሪ ቀለበትን መቆጣጠር -3 ደረጃዎች (ከስዕሎች ጋር)

ቪዲዮ: በምልክት ዳሳሽ የኒዮፒክስል መሪ ቀለበትን መቆጣጠር -3 ደረጃዎች (ከስዕሎች ጋር)

ቪዲዮ: በምልክት ዳሳሽ የኒዮፒክስል መሪ ቀለበትን መቆጣጠር -3 ደረጃዎች (ከስዕሎች ጋር)
ቪዲዮ: Ethiopia: ኩላሊት ሲጎዳ የሚታዩ 8 ምልክቶች... አሳሳቢውን የኩላሊት በሽታ እንዴት በቀላሉ እንከላከለው 2024, ህዳር
Anonim
Image
Image
ስብሰባ እና ስቀል
ስብሰባ እና ስቀል

በዚህ መማሪያ ውስጥ ሁለቱንም አርዱዲኖ UNO በመጠቀም እንዴት ማዋሃድ እንደሚችሉ ለማወቅ በምልክት ዳሳሽ (APDS-9960) እና በኒዮፒክስል ቀለበት እንጫወታለን።

የመጨረሻው ምርት የግራ ንቅናቄን ወደ ቀኝ ወይም ወደ ግራ በማንቀሳቀስ ፣ እና ወደ ላይ ምልክቶች ወደ ቀይ ምልክቶች በመቀየር ምላሽ ይሰጣል።

በቀጣዮቹ ደረጃዎች ውስጥ የክፍሉን ዝርዝር እና አካሎቹን እንዴት ማገናኘት እንደሚቻል በአጭሩ ያብራራሉ። እና ከዚያ እንዴት እንደሚሰራ ለማወቅ የኮዱን ደረጃ በደረጃ እንገመግማለን።

ደረጃ 1: አካላት

1. አርዱዲኖ UNO

2. የዩኤስቢ ገመድ

3. APDS9960 የእጅ ምልክት ዳሳሽ (https://www.sparkfun.com/products/12787)

4. 24 መሪ የኒዮፒክስል መሪ ቀለበት (https://www.adafruit.com/product/1586)

5. ወንድ-ሴት ፣ ወንድ-ወንድ የዳቦ ሰሌዳ ኬብሎች

6. የዳቦ ሰሌዳ

7. ለ 5 የመሪ ቀለበት የኃይል አቅርቦት (4 ባትሪ መል back እጠቀማለሁ)

8. የኒዮፒክስል ቀለበቱን ከዳቦ ሰሌዳው ጋር ለማያያዝ ሶስት የወንድ ፒንዎችን ማለትም GND ፣ PWR እና የመቆጣጠሪያ ፒን መሸጥ ያስፈልግዎታል። ለዚህ ብየዳ ብረት እና ፍሰት ያስፈልግዎታል

እዚህ ያሉት ዋና ዋና ክፍሎች APDS-9960 የምልክት ዳሳሽ እና 24 ኒዮፒክስል ቀለበት ናቸው። እንደፈለጉ የተለያዩ አርዱዲኖዎችን ፣ የዩኤስቢ ኬብሎችን የኃይል አቅርቦቶችን እና የዳቦ ሰሌዳዎችን መለወጥ ይችላሉ።

ደረጃ 2 - ስብሰባ እና ስቀል

ስብሰባ

ከመጀመርዎ በፊት በጠረጴዛዎ ላይ ያሉት ሁሉም ክፍሎች መኖራቸውን ያረጋግጡ። ለመከተል አንዳንድ ጥሩ ደረጃዎች ይኖረናል:). እኔ ደግሞ የ Fritzing schematic ን እንደ ስዕል እና እንዲሁም በፍሪቲንግ ቅርጸት አያይዣለሁ።

1. ሶደር 3 ወንድ ፒኖች ወደ ኒዮፒክስል ቀለበት (GND ፣ PWR ፣ የመቆጣጠሪያ ፒን)

2. የኒዮፒክስል ቀለበትን ከዳቦ ሰሌዳ ጋር ያያይዙ

3. የ APDS9960 ዳሳሹን ከዳቦ ሰሌዳ ጋር ያያይዙ

4. መሬቶቹን ያገናኙ - የባትሪ ጥቅል ፣ አርዱዲኖ UNO ፣ APDS9960 እና ኒኦፒክስል ወደ የዳቦ ሰሌዳ መሬት

5. ኃይሉን ያገናኙ - arduino UNO 3V ወደ APDS9960 የኃይል ፒን ፣ ኒዮፒክስል ወደ ባትሪ ጥቅል ኃይል

6. የኒዮፒክስል መቆጣጠሪያ ፒኑን ከአርዲኖ ዲ 6 ፒን ጋር ያገናኙ

7. የ APDS9960 ን SDA እና SCL ን ከ A4 እና A5 ጋር በቅደም ተከተል ያገናኙ

8. የ APDS9960 ማቋረጫ ፒን ከ arduino D2 ጋር ያገናኙ

ኮድ ሰቀላ

በመጀመሪያ አስፈላጊዎቹን የአርዱዲኖ ቤተ -ፍርግሞችን ማውረድ እና መጫን ያስፈልግዎታል-

1. የኒዮፒክስል ቀለበት ቤተ -መጽሐፍት-

2. የምልክት ዳሳሽ ቤተ-መጽሐፍት-

የአርዱዲኖ ቤተ -ፍርግሞችን እንዴት እንደሚጭኑ ካላወቁ ይህንን አጋዥ ስልጠና ይመልከቱ።

ከላይ ያሉትን ቤተ -ፍርግሞችን ካወረዱ እና ከጫኑ በኋላ እዚህ የሚገኘውን የእኔ አርዱዲኖ ማከማቻን መዝጋት ወይም ማውረድ ይችላሉ- https://github.com/danionescu0/arduino ፣ እና ይህንን ንድፍ እንጠቀማለን- https://github.com/danionescu0 /አርዱዲኖ/ዛፍ/ማስተር/ፕሮጄክቶች/ኒዮፒክስል_ሪንግ_ግዜሮች

በሚቀጥለው ክፍል ኮዱን በቀጥታ በዚህ መማሪያ ውስጥ እጨምራለሁ ፣ ስለዚህ ከፈለጉ ከፈለጉ ከዚያ መቅዳት እና መለጠፍ ይችላሉ።

በመጨረሻ የዩኤስቢ ገመድ በመጠቀም አርዱዲኖን ኮምፒተርን ያገናኙ ፣ 1.5 ቮ ባትሪዎችን በባትሪ ጥቅል ውስጥ ያስገቡ እና ንድፉን ወደ አርዱዲኖ ይስቀሉ።

ደረጃ 3: እንዴት ይሠራል?

በዚህ የመጨረሻ ክፍል እነዚህ አካላት እንዴት አንድ ላይ እንደሚጣመሩ ፣ ቤተመፃህፍቶቻቸውን እንዴት እንደሚጠቀሙ እና የእኔን ኮድ እንዴት እንዳዋቀርኩ እንማራለን።

በመጀመሪያ እኛ በምንጠቀምባቸው አነፍናፊ እና በኒዮፒክስል ቤተ -መጽሐፍት ኤፒአይ ዘዴዎች በኩል ፈጣን እይታ እንይ

1. ኒኦፒክስል ኤፒአይ ከአዳፍ ፍሬ

ከዚህ ቤተ -መጽሐፍት የግለሰብ መሪ ቀለምን የሚቆጣጠሩ እና ተግባራዊ የሚያደርጉባቸውን ዘዴዎች እንጠቀማለን

- ቤተ -መጽሐፍቱን ያካትቱ-

#ያካትቱ

- ቤተ -መጽሐፍቱን ያውጁ

#ገላጭ ኒዮፒክስድ / መቆጣጠሪያ / ፒን 6

#ጥራት NUM_LEDS 24 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS ፣ NEOPIXED_CONTROL_PIN ፣ NEO_RBG + NEO_KHZ800) ፤

- ማስጀመር

#በተለምዶ በቅንብር ብሎክ ውስጥ

ባዶነት ማዋቀር () {strip.begin (); # ምናልባት እዚህ ሌሎች ነገሮች አሉ…. }

- ግለሰባዊ ፒክሴሎችን ያብሩ ከዚያም ሁሉንም ማሻሻያዎች ወደ ጭረት ይተግብሩ (በሆነ መንገድ ይስጡት)

# ቀይ እንዲሆን ፒክሰል 0 ን ያዋቅሩ

strip.setPixelColor (0, strip. Color (255, 0, 0)); # ፒክሰል 1 አረንጓዴ ስትሪፕ እንዲሆን ያዋቅሩ። # ፒክሴልን 2 ሰማያዊ ስትሪፕ እንዲሆን ያዋቅሩ። strip.show ();

2. APDS 9960 የእጅ ምልክት ዳሳሽ

ከዚህ ቤተ -መጽሐፍት የ «ማንበብ ምልክት» ተግባርን እንጠቀማለን። ይህ ተግባር በግራ-ቀኝ ፣ ወደ ላይ ፣ ወደታች ፣ ከሩቅ ትዕዛዞች መካከል መለየት ይችላል። እዚህ አንድ ብልሃት አለ ፣ እኛ ለተገነዘበው የመጨረሻ ምልክት ዳሳሹን ያለማቋረጥ አንጠይቀውም። የእጅ ምልክት በተገኘበት አቋራጭ ቦርዱ “ፒንግ” የማድረግ ችሎታ አለው።

- ከኒዮፒክስል ጋር ተመሳሳይ የሆነውን ቤተመጽሐፍት ያካትቱ

- ቤተ መፃህፍቱን የሚያቋርጥ ፒን ፣ እና የተቋረጠውን ባንዲራ ያውጁ

#APDS9960_INT 2 ን ይግለጹ

SparkFun_APDS9960 apds = SparkFun_APDS9960 (); int isr_flag = 0;

- ቤተመፃህፍቱን ፣ በተለይም የውቅረት ተግባርን ያስጀምሩ

ባዶነት ማዋቀር ()

{ # የተቋረጠውን ፒን እንደ ግቤት ያውጁ እና አንድ ተግባር በእሱ ላይ ያያይዙ pinMode (APDS9960_INT ፣ INPUT) ፤ አባሪ መቋረጥ (0 ፣ interruptRoutine ፣ FALLING); ከሆነ (apds.init () && apds.enableGestureSensor (እውነተኛ)) {Serial.println ("APDS-9960 ማስጀመሪያ ተጠናቋል"); } ሌላ {Serial.println ("በ APDS-9960 init ወቅት የሆነ ችግር ተፈጥሯል!"); } # ሌሎች ነገሮችን ያስጀምሩ ምናልባት}

- የተቋረጠውን ተግባር ይግለጹ ፣ እዚህ እኛ ባንዲራ ብቻ እናስቀምጣለን

ባዶነት interruptRoutine () {

isr_flag = 1; }

- በምልክት ተግባር ውስጥ የእጅ ምልክት ተገኝቶ እንደሆነ በየጊዜው ባንዲራውን ይፈትሹ

ባዶነት loop ()

(# isr_flag == 1) ከሆነ ሰንደቁን ይፈትሹ { # ሰንደቅ ዓላማው ከተዋቀረ ማቋረጫውን ያስወግዱ ፣ አስፈላጊውን ሂደት በ handleGesture () ተግባር # ውስጥ ያድርጉ እና ከዚያ ሰንደቅ ዓላማውን እንደገና ያስጀምሩ እና የተቋረጠውን የመለያየት መቋረጥ (0) እንደገና ያያይዙ። handleGesture (); isr_flag = 0; አባሪ መቋረጥ (0 ፣ interruptRoutine ፣ FALLING); } # እዚህ ሌላ ኮድ ምናልባት}

- የመጨረሻውን የእጅ ምልክት ለመጠየቅ የምንችልበትን የ HandGesture () ተግባርን ይግለጹ

ባዶ ቦታ መያዣ () {

# ምንም የእጅ ምልክት ሊመለስ የማይችል ከሆነ ፣ ((apds.isGestureAvailable ()) {መመለስ; } # የመጨረሻውን የእጅ ምልክት ያነባል ፣ ከሚታወቁት ጋር ያወዳድራል እና የመልእክት መቀየሪያ (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); ሰበር; መያዣ DIR_DOWN: Serial.println ("ታች"); ሰበር; መያዣ DIR_LEFT: Serial.println ("LEFT"); ሰበር; መያዣ DIR_RIGHT: Serial.println ("RIGHT"); ሰበር; መያዣ DIR_FAR: Serial.println ("FAR"); ሰበር; }}

አሁን ሙሉውን ኮድ በተግባር ላይ እናየው -

ስለዚህ የምልክት አነፍናፊውን እና የኒዮፒክስል ቀለበትን መሰረታዊ ኤፒአይ አብራራሁ ፣ አሁን ነገሮችን አንድ ላይ እናድርግ-

ስልተ ቀመር እንደሚከተለው ይሠራል

- ቤተ -ፍርግሞችን ያስጀምሩ (ከላይ ያለውን ኮድ ይመልከቱ)

- “ledStates” የሚባሉትን የመሪ ጥንካሬዎችን ድርድር ይፍጠሩ። ይህ ድርድር ከ 150 ወደ 2 በሚወርድበት ሁኔታ የተደራጁ 24 መሪ ጥንካሬዎችን ይይዛል

- የተቋረጠውን ፒን የተቀየረ ከሆነ በዋናው loop ቼክ ውስጥ የሊድ አኒሜሽን ወይም ቀለም ለመቀየር ጊዜው አሁን ነው

- የ “handleGesture ()” ተግባር የመጨረሻውን የእጅ ምልክት ይፈትሽ እና ተግባሩን “toggleColor” ን ለላይ -ታች ምልክቶች ይጠራል ወይም ለ LEFT - RIGHT የእጅ ምልክቶች ዓለም አቀፋዊ ተለዋዋጭ “ledDirection” ያዋቅራል።

- የ “toggleColor ()” ተግባሩ በቀላሉ ከ 0 ፣ 1 ፣ 2 እሴቶች ጋር “የቀለም ምርጫ” የተባለ ዓለም አቀፋዊ ተለዋዋጭ ይለውጣል።

- እንዲሁም በዋናው loop ተግባር ውስጥ “animateLeds ()” የሚል ሌላ ተግባር ተብሎ ይጠራል. ይህ ተግባር 100 ሚሊሰከንዶች ካለፉ ይፈትሻል ፣ እና እንደዚያ ከሆነ የ “rotateLeds ()” ተግባርን በመጠቀም ሌዶቹን ያሽከረክራል እና ከዚያ እንደገና ያስተካክላል

- “rotateLeds ()” “intermediateLedStates” የተባለ ሌላ ድርድርን በመጠቀም ሌዶቹን ወደ ፊት ወይም ወደ ኋላ “ያሽከረክራል”።

የማሽከርከር “ውጤት” እንደዚህ ይመስላል

# ከተነሳ በኋላ

{150 ፣ 100 ፣ 70 ፣ 50 ፣ 40 ፣ 30 ፣ 10 ፣ 2 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0}; # ከ rotateLeds () በኋላ {0 ፣ 150 ፣ 100 ፣ 70 ፣ 50 ፣ 40 ፣ 30 ፣ 10 ፣ 2 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0, 0, 0}; # ከ rotateLeds () በኋላ እንደገና ተጠርቷል {0 ፣ 0 ፣ 150 ፣ 100 ፣ 70 ፣ 50 ፣ 40 ፣ 30 ፣ 10 ፣ 2 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0, 0, 0, 0}; # እናም ይቀጥላል

ለዚህ መጀመሪያ አዲሱን ድርድር ይፈጥራል እና በአዲሱ የሥራ መደቦች ላይ የድሮ መሪ ጥንካሬዎችን ይገለብጣል (ቦታውን ይጨምሩ ወይም ዝቅ ያድርጉት)። ከዚያ በኋላ የ “ledStates” ድርድርን ከ “መካከለኛ” ደረጃዎች ጋር ይተካዋል ስለዚህ ሂደቱ ከሌላ 100 ሚሊሰከንዶች በኋላ ይቀጥላል።

#"SparkFun_APDS9960.h" ን ያካትቱ።

#"አዳፍ ፍሬ_ኔኦፒክስል.ህ" ን ያካትቱ

#"Wire.h" #ዲፊኔ ኒዮፒዲክስ_ኮንትሮል_ፒን 6 #ዲፊን NUM_LEDS 24 #define APDS9960_INT 2 #define LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIX SparkFun_APDS9960 apds = SparkFun_APDS9960 (); ያልተፈረመ ረጅም lastLedChangeTime = 0; አጭር መሪ አቅጣጫ = 0; አጭር ቀለም ምርጫ = 0; ባይት ledStates = {150 ፣ 100 ፣ 70 ፣ 50 ፣ 40 ፣ 30 ፣ 10 ፣ 2 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0, 0}; int isr_flag = 0; ባዶነት ማዋቀር () {Serial.begin (9600); Serial.println ("ፕሮግራሙ ተጀመረ"); strip.begin (); pinMode (APDS9960_INT ፣ ማስገቢያ); አባሪ ማቋረጫ (0 ፣ interruptRoutine ፣ FALLING); ከሆነ (apds.init () && apds.enableGestureSensor (እውነተኛ)) {Serial.println ("APDS-9960 ማስጀመሪያ ተጠናቋል"); } ሌላ {Serial.println ("በ APDS-9960 init ወቅት የሆነ ችግር ተፈጥሯል!"); } lastLedChangeTime = ሚሊስ (); Serial.println ("Init በተሳካ ሁኔታ"); } ባዶነት loop () {ከሆነ (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; አባሪ ማቋረጫ (0 ፣ interruptRoutine ፣ FALLING); } animateLeds (); } ባዶነት interruptRoutine () {isr_flag = 1; } / ** * ይህ ከ APDS9960 ዳሳሽ የእጅ ምልክቶችን ያስተናግዳል * ወደ ላይ እና ወደ ታች የእጅ ምልክቶች ወደ ቀያሪ ቀለም ተግባር * የግራ እና የቀኝ ምልክቶች የሚመራውን አኒሜሽን * / ባዶ ባዶ እጀታ አቅጣጫን () {ከሆነ (! Apds.isGestureAvailable ()) {መመለስ; } ማብሪያ (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); ሰበር; መያዣ DIR_DOWN: Serial.println ("ታች"); toggleColor (); ሰበር; መያዣ DIR_LEFT: ledDirection = 1; Serial.println ("LEFT"); ሰበር; መያዣ DIR_RIGHT: ledDirection = -1; Serial.println ("RIGHT"); ሰበር; መያዣ DIR_FAR: ledDirection = 0; Serial.println ("FAR"); ሰበር; }} / ** * የአሁኑን የሊዶች ቀለም ይለውጡ * ይህ ተግባር በተጠራ ቁጥር የሊዶቹን ሁኔታ * / ባዶ ባዶ toggleColor () {if (colorSelection == 0) {colorSelection = 1; } ሌላ ከሆነ (colorSelection == 1) {colorSelection = 2; } ሌላ {colorSelection = 0; }} / ** * እነማ ከ LED_SPEED_STEP_INTERVAL ሚሊስ በኋላ ይሠራል / በመጀመሪያ የ rotateLeds ተግባር ተጠርቷል ፣ ከዚያ የሊዱ ቀለሞች የሚዘጋጁት ባለአይፒ / / ባዶ ባዶ animateLeds () {ከሆነ (ሚሊ () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {መመለስ; } rotateLeds (); ለ (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates ))); strip.show (); } lastLedChangeTime = ሚሊስ (); } /** * የሁለተኛ ድርድርን “intermediateLedStates” በመጠቀም ፣ የሊድ ኃይሎች አኒሜሽን ናቸው * በመጀመሪያ ከ “ledStates” ያሉት እሴቶች በ “intermediateLedStates” ላይ ይገለበጣሉ ስለዚህ * እንቀመጥ “የመሪዎች ግዛቶች” ድርድር {100 ፣ 80 ፣ 60 ፣ 0 ነው, 0, 0} እና የመሪ አቅጣጫው 1 * ነው ፣ ከዚያ ይህ ተግባር ‹ledStates› ድርድር ከተጠራ በኋላ {0 ፣ 100 ፣ 80 ፣ 60 ፣ 0 ፣ 0} የማሽከርከር ውጤት */ ባዶ ባዶ rotateLeds () {byte intermediateLedStates [NUM_LEDS]; ለ (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } ለ (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } ሌላ {intermediateLedStates [i + 1] = ledStates ; }} ሌላ {ከሆነ (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } ሌላ {intermediateLedStates [i - 1] = ledStates ; }}} ለ (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int intensity) {switch (colorSelection) {case 0: return strip. Color (ኃይለኛ ፣ 0 ፣ 0); ጉዳይ 1 - የመመለሻ ገመድ ቀለም (0 ፣ ጥንካሬ ፣ 0); ነባሪ: ተመለስ ስትሪፕ ቀለም (0 ፣ 0 ፣ ጥንካሬ); }}

ይህንን እንደወደዱት ተስፋ አደርጋለሁ ፣ ጥያቄዎችን ለመጠየቅ የአስተያየቶችን ክፍል መጠቀም ይችላሉ።

የሚመከር: