Orodha ya maudhui:

Upangaji wa Bead Robotic: Hatua 3 (na Picha)
Upangaji wa Bead Robotic: Hatua 3 (na Picha)

Video: Upangaji wa Bead Robotic: Hatua 3 (na Picha)

Video: Upangaji wa Bead Robotic: Hatua 3 (na Picha)
Video: 1986 Range Rover, rusty fuel tank fix, Part 2 - Edd China's Workshop Diaries 2024, Julai
Anonim
Image
Image
Upangaji wa Bead Robotic
Upangaji wa Bead Robotic
Upangaji wa Bead Robotic
Upangaji wa Bead Robotic
Upangaji wa Bead Robotic
Upangaji wa Bead Robotic

Katika mradi huu, tutaunda roboti ili kuchagua shanga za Perler kwa rangi.

Nimekuwa nikitaka kujenga roboti ya kuchagua rangi, kwa hivyo binti yangu alipovutiwa na uundaji wa shanga la Perler, niliona hii kama fursa nzuri.

Shanga za Perler hutumiwa kuunda miradi ya sanaa iliyochanganywa kwa kuweka shanga nyingi kwenye ubao wa mbao, na kisha kuziyeyusha pamoja na chuma. Kwa ujumla unanunua shanga hizi kwenye pakiti kubwa za rangi 22, 000 za bead, na kutumia muda mwingi kutafuta rangi unayotaka, kwa hivyo nilifikiri kuzipanga kunaongeza ufanisi wa sanaa.

Ninafanya kazi kwa Phidgets Inc. kwa hivyo nilitumia zaidi Friji za mradi huu - lakini hii inaweza kufanywa kwa kutumia vifaa vyovyote vinavyofaa.

Hatua ya 1: Vifaa

Hapa ndio nilitumia kujenga hii. Niliijenga kwa 100% na sehemu kutoka kwa phidgets.com, na vitu ambavyo nilikuwa nimelala kuzunguka nyumba.

Bodi za Phidgets, Motors, Vifaa vya ujenzi

  • HUB0000 - Kitambaa cha Hub cha VINT
  • 1108 - Sensor ya Magnetic
  • 2x STC1001 - 2.5A Stepper Phidget
  • 2x 3324 - 42STH38 NEMA-17 Bipolar isiyo na gear Stepper
  • 3x 3002 - Kebo ya Phidget 60cm
  • 3403 - USB2.0 4-Port Hub
  • 3031 - Nguruwe ya Kike 5.5x2.1mm
  • 3029 - 2 waya 100 'Cable Iliyopotoka
  • 3604 - 10mm Nyeupe LED (Mfuko wa 10)
  • 3402 - Kamera ya mtandao ya USB

Sehemu Zingine

  • Ugavi wa Umeme wa 24VDC 2.0A
  • Mbao chakavu na chuma kutoka karakana
  • Mahusiano ya Zip
  • Chombo cha plastiki na chini imekatwa

Hatua ya 2: Tengeneza Robot

Kubuni Robot
Kubuni Robot
Kubuni Robot
Kubuni Robot
Kubuni Robot
Kubuni Robot

Tunahitaji kubuni kitu ambacho kinaweza kuchukua shanga moja kutoka kwa kibonge cha kuingiza, kuiweka chini ya kamera ya wavuti, na kisha kuiingiza kwenye pipa linalofaa.

Kuchukua Shanga

Niliamua kufanya sehemu ya 1 na vipande 2 vya plywood pande zote, kila moja ikiwa na shimo lililopigwa mahali pamoja. Kipande cha chini kimewekwa sawa, na kipande cha juu kimeambatanishwa na motor ya stepper, ambayo inaweza kuizunguka chini ya kibati kilichojaa shanga. Wakati shimo linasafiri chini ya kibonge, huchukua shanga moja. Ninaweza kuzungusha chini ya kamera ya wavuti, na kisha kuzunguka zaidi hadi inalingana na shimo kwenye kipande cha chini, na wakati huo inapita.

Katika picha hii, ninajaribu kuwa mfumo unaweza kufanya kazi. Kila kitu kimerekebishwa isipokuwa kipande cha juu cha plywood, ambacho kimeambatanishwa na motor ya stepper nje ya mtazamo chini. Kamera ya wavuti bado haijawekwa. Ninatumia tu Jopo la Udhibiti wa Phidget kugeukia motor wakati huu.

Uhifadhi wa Shanga

Sehemu inayofuata ni kubuni mfumo wa pipa kwa kushikilia kila rangi. Niliamua kutumia motor ya pili ya chini chini kusaidia na kuzungusha kontena lenye mviringo na vyumba vilivyo sawa. Hii inaweza kutumika kuzungusha sehemu sahihi chini ya shimo ambalo bead itaacha.

Nilijenga hii kwa kutumia kadibodi na mkanda wa bomba. Jambo muhimu zaidi hapa ni msimamo - kila chumba kinapaswa kuwa saizi sawa, na kitu kizima kinapaswa kupimwa sawasawa kwa hivyo inazunguka bila kuruka.

Uondoaji wa shanga hukamilishwa kwa njia ya kifuniko kinachofaa ambacho hufunua chumba kimoja kwa wakati, ili shanga ziweze kumwagika.

Kamera

Kamera ya wavuti imewekwa juu ya bamba la juu kati ya kitanda na eneo la chini la shimo. Hii inaruhusu mfumo kutazama shanga kabla ya kuiacha. LED hutumiwa kuangaza shanga chini ya kamera, na taa iliyoko imefungwa, ili kutoa mazingira thabiti ya taa. Hii ni muhimu sana kwa utambuzi sahihi wa rangi, kwani taa iliyoko kwa kweli inaweza kutupa rangi inayoonekana.

Kugundua Mahali

Ni muhimu kwa mfumo kuweza kugundua mzunguko wa kitenganisho cha shanga. Hii hutumiwa kusanidi nafasi ya kwanza wakati wa kuanza, lakini pia kugundua ikiwa motor ya stepper imetoka kwa usawazishaji. Katika mfumo wangu, shanga wakati mwingine hukaa wakati wa kuokota, na mfumo ulihitaji kuweza kugundua na kushughulikia hali hii - kwa kuunga mkono kidogo na kujaribu agian.

Kuna njia nyingi za kushughulikia hili. Niliamua kutumia sensa ya sumaku ya 1108, na sumaku iliyoingizwa pembeni mwa sahani ya juu. Hii inaniruhusu kuthibitisha msimamo kwenye kila mzunguko. Suluhisho bora labda itakuwa encoder kwenye motor stepper, lakini nilikuwa na 1108 iliyolala karibu na hivyo nilitumia hiyo.

Maliza Roboti

Kwa wakati huu, kila kitu kimefanywa kazi, na kujaribiwa. Ni wakati wa kuweka kila kitu vizuri na nenda kwenye programu ya uandishi.

Motors 2 za stepper zinaendeshwa na vidhibiti vya STC1001. Kitovu cha HUB000 - USB VINT hutumiwa kwa kuendesha vidhibiti vya stepper, na pia kusoma sensa ya sumaku na kuendesha LED. Kamera ya wavuti na HUB0000 zote zimeunganishwa kwenye kitovu kidogo cha USB. Nguruwe ya 3031 na waya fulani hutumiwa pamoja na usambazaji wa umeme wa 24V kuwezesha motors.

Hatua ya 3: Andika Msimbo

Image
Image

C # na Studio ya Visual 2015 hutumiwa kwa mradi huu. Pakua chanzo juu ya ukurasa huu na ufuate - sehemu kuu zimeorodheshwa hapa chini

Uanzishaji

Kwanza, lazima tuunde, tufungue na tuanzishe vitu vya Phidget. Hii imefanywa katika hafla ya kupakia fomu, na Phidget huambatanisha washughulikiaji.

Utupu wa kibinafsi Fomu1_Load (mtumaji wa vitu, Mikutano ya Matukio e) {

/ * Anzisha na ufungue Tepe * /

juu. HubPort = 0; ambatisha + = Juu_Ushikamana; juu. Detach + = Juu_Detach; juu. PositionChange + = Top_PositionChange; juu. Fungua ();

chini. HubPort = 1;

chini. Ondanisha + = Chini_Uunganisha; chini. Detach + = Chini_Detach; chini. PositionChange + = Bottom_PositionChange; chini Fungua ();

magSensor. HubPort = 2;

magSensor. IsHubPortDevice = kweli; magSensor. Attach + = MagSensor_Attach; magSensor. Detach + = MagSensor_Detach; magSensor. SensorChange + = MagSensor_SensorChange; Fungua ();

kuongozwa. HubPort = 5;

led. IsHubPortDevice = kweli; kuongozwa. Channel = 0; wakiongozwa. Anganisha + = Kuunganisha_kuunganisha; led. Detach + = Led_Detach; kuongozwa. Fungua (); }

utupu wa kibinafsi Led_Attach (mtumaji wa kitu, Phidget22. Events. AttachEventArgs e) {

ledAttachedChk. Checked = kweli; iliongozwa. Jimbo = kweli; ledChk. Checked = kweli; }

utupu wa kibinafsi MagSensor_Attach (mtumaji wa kitu, Phidget22. Events. AttachEventArgs e) {

magSensorAttachedChk. Checked = kweli; MagSensor. SensorType = Aina ya VoltageSensorType. PN_1108; magSensor. DataInterval = 16; }

utupu wa kibinafsi Bottom_Attach (mtumaji wa kitu, Phidget22. Events. AttachEventArgs e) {

chiniAttachedChk. Checked = kweli; chini. CurrentLimit = chiniCurrentLimit; chini. Engaged = kweli; chini. VelocityLimit = chiniVelocityLimit; chini. Kuharakisha = chiniPata; chini. DataInterval = 100; }

utupu wa kibinafsi Top_Attach (mtumaji wa kitu, Phidget22. Events. AttachEventArgs e) {

topAttachedChk. Checked = kweli; juu. CurrentLimit = juuCurrentLimit; juu. Kuhusika = kweli; juu. RescaleFactor = -1; juu. VelocityLimit = -topVelocityLimit; juu. Uharakishaji = -topAccel; juu. DataInterval = 100; }

Tulisoma pia katika habari yoyote iliyohifadhiwa ya rangi wakati wa uanzishaji, kwa hivyo kukimbia kwa hapo awali kunaweza kuendelea.

Kuweka Pikipiki

Nambari ya utunzaji wa magari ina kazi za urahisi wa kusonga motors. Magari niliyotumia ni hatua 3, 200 1/16 kwa mapinduzi, kwa hivyo niliunda mara kwa mara kwa hii.

Kwa motor ya juu, kuna nafasi 3 tunataka kuweza kutuma kwa motor kwa: kamera ya wavuti, shimo, na sumaku ya kuweka. Kuna kazi ya kusafiri kwa kila nafasi hizi:

utupu wa kibinafsi nextMagnet (Boolean subiri = uwongo) {

mbili posn = juu. Nafasi% hatuaPerRev;

juu. TargetPosition + = (stepsPerRev - posn);

ikiwa (subiri)

wakati (juu. Inasonga) Thread. Kulala (50); }

Kamera ya faragha inayofuata (Kamera ya Boolean = uwongo) {

mbili posn = juu. Nafasi% hatuaPerRev; ikiwa (posn <Properties. Settings. Default.cameraOffset) juu. TargetPosition + = (Properties. Settings. Default.cameraOffset - posn); mwingine juu. TargetPosition + = ((Properties. Settings. Default.cameraOffset - posn) + stepsPerRev);

ikiwa (subiri)

wakati (juu. Inasonga) Thread. Kulala (50); }

utupu wa kibinafsi nextHole (Boolean subiri = uwongo) {

mbili posn = juu. Nafasi% hatuaPerRev; ikiwa (posn <Properties. Settings. Default.holeOffset) juu. TargetPosition + = (Properties. Settings. Default.holeOffset - posn); mwingine juu. TargetPosition + = ((Properties. Settings. Default.holeOffset - posn) + stepsPerRev);

ikiwa (subiri)

wakati (juu. Inasonga) Thread. Kulala (50); }

Kabla ya kuanza kukimbia, bamba la juu limepangwa kwa kutumia sensa ya sumaku. Kazi ya alignMotor inaweza kuitwa wakati wowote kupatanisha sahani ya juu. Kazi hii kwanza inageuza sahani hadi mapinduzi 1 kamili hadi itaona data ya sumaku juu ya kizingiti. Halafu inahifadhi nyuma kidogo na inasonga mbele tena polepole, ikinasa data ya sensorer inapoendelea. Mwishowe, inaweka msimamo kwa eneo la juu la data ya sumaku, na inabadilisha mpangilio kuwa nafasi ya 0. Kwa hivyo, nafasi ya sumaku kubwa inapaswa kuwa kwenye (juu. Nafasi% hatuaPerRev)

Thread alignMotorThread; Boolean sawMagnet; mara mbili magSensorMax = 0; binafsi batili alignMotor () {

// Pata sumaku

juu. DataInterval = juu. MinDataInterval;

sawMagnet = uwongo;

magSensor. SensorChange + = magSensorStopMotor; juu. VelocityLimit = -1000;

kujaribuCount = 0;

jaribu tena:

juu. TargetPosition + = stepsPerRev;

wakati (juu. Inasonga &&! sawMagnet) Thread. Kulala (25);

ikiwa (! sawMagnet) {

ikiwa (tryCount> 3) {Console. WriteLine ("Pangiliana imeshindwa"); juu. Kushirikishwa = uwongo; chini. Engaged = uongo; runtest = uwongo; kurudi; }

kujaribuCount ++;

Console. WriteLine ("Je! Tumekwama? Kujaribu kuhifadhi nakala rudufu…"); juu. Mlengo wa Lengo - = 600; wakati (juu. Inasonga) Thread. Kulala (100);

faida ya goto;

}

juu. VelocityLimit = -100;

magData = Orodha mpya> (); magSensor. SensorChange + = magSensorCollectPositionData; juu. Mlengo wa Malengo + = 300; wakati (juu. Inasonga) Thread. Kulala (100);

magSensor. SensorChange - = magSensorCollectPositionData;

juu. VelocityLimit = -topVelocityLimit;

KeyValuePair max = magData [0];

foreach (jozi ya KeyValuePair katika magData) ikiwa (jozi. Thamani> upeo wa Thamani) max = jozi;

juu. AddPositionOffset (-max. Key);

magSensorMax = Thamani ya Thamani;

juu. TargetPosition = 0;

wakati (juu. Inasonga) Thread. Kulala (100);

Console. WriteLine ("Pangilia ilifanikiwa");

}

Orodha> magData;

utupu wa kibinafsi magSensorCollectPositionData (mtumaji wa kitu, Phidget22. Events. }

utupu wa kibinafsi magSensorStopMotor (mtumaji wa kitu, Phidget22. Events. VoltageRatioInputSensorChangeEventArgs e) {

ikiwa (juu. IsMoving && e. SensorValue> 5) {top. TargetPosition = top. Position - 300; MagSensor. SensorChange - = magSensorStopMotor; sawMagnet = kweli; }}

Mwishowe, gari ya chini inadhibitiwa kwa kuipeleka kwa moja ya nafasi za chombo cha bead. Kwa mradi huu, tuna nafasi 19. Algorithm ni kuchagua njia fupi zaidi, na inageuka saa moja kwa moja au kinyume cha saa.

faragha int BottomPosition {pata {int posn = (int) chini. Position% stepsPerRev; ikiwa (posn <0) posn + = hatuaPreRev;

kurudi (int) Math. Mzunguko (((posn * beadCompartments) / (double) stepsPerRev));

} }

utupu wa kibinafsi SetBottomPosition (int posn, bool wait = false) {

posn = posn% shangaCompartments; lengo mbiliPosn = (posn * stepsPerRev) / beadCompartments;

mara mbili ya sasaPosn = chini. Nafasi% hatuaPerRev;

mara mbili posnDiff = targetPosn - currentPosn;

// Weka kama hatua kamili

posnDiff = ((int) (posnDiff / 16)) * 16;

ikiwa (posnDiff <= 1600) chini. TargetPosition + = posnDiff; chini nyingine. TargetPosition - = (stepsPerRev - posnDiff);

ikiwa (subiri)

wakati (chini. Inasonga) Thread. Kulala (50); }

Kamera

OpenCV hutumiwa kusoma picha kutoka kwa kamera ya wavuti. Thread ya kamera imeanza kabla ya kuanza uzi kuu wa upangaji. Uzi huu unasoma kila wakati kwenye picha, huhesabu rangi wastani kwa mkoa maalum kwa kutumia Maana na inasasisha kutofautisha kwa rangi ya ulimwengu. Uzi pia hutumia HoughCircles kujaribu kugundua bead, au shimo kwenye bamba la juu, kusafisha eneo linaloangalia utambuzi wa rangi. Kizingiti na nambari za HoughCircles ziliamuliwa kupitia jaribio na makosa, na hutegemea sana kamera ya wavuti, taa, na nafasi.

bool runVideo = kweli; video bool Mbio = uwongo; Kukamata Video; Uzi cvUkanda; Rangi imegunduliwa Rangi; Kuchunguza kwa Boolean = uwongo; int detectCnt = 0;

utupu wa kibinafsi cvThreadFunction () {

videoKukimbia = uwongo;

kukamata = VideoCapture mpya (Camera iliyochaguliwa);

kutumia (Window window = Window mpya ("capture")) {

Picha ya kitanda = Mat mpya (); Picha ya kitanda2 = Mat mpya (); wakati (runVideo) {kukamata. Soma (picha); ikiwa (picha. Dalili ()) kuvunja;

ikiwa (kugundua)

gunduaCnt ++; gundua mwingineCnt = 0;

ikiwa (kugundua || mzungukoDetectChecked || showDetectionImgChecked) {

Cv2. CvtColor (picha, picha2, Nambari za Uongofu za Rangi. BGR2GRAY); Mat thres = picha 2. Kizingiti ((mara mbili) Mali. Settings. Default. VideoThresh, 255, ThresholdTypes. Binary); thres = thres. GaussianBlur (OpenCvSharp. Size mpya (9, 9), 10);

ikiwa (showDetectionImgChecked)

picha = thres;

ikiwa (kugundua || mzungukoDetectChecked) {

CircleSegment bead = thres. HoughCircles (HoughMethods. Gradient, 2, /*thres. Rows/4*/ 20, 200, 100, 20, 65); ikiwa (bead. Urefu> = 1) {picha. Circle (bead [0]. Kituo, 3, Scalar mpya (0, 100, 0), -1); picha. Circle (bead [0]. Center, (int) bead [0] Radius, Scalar mpya (0, 0, 255), 3); ikiwa (bead [0]. Radius> = 55) {Properties. Settings. Default.x = (decimal) bead [0]. Center. X + (decimal) (bead [0]. Radius / 2); Mali. Settings. Default.y = (decimal) bead [0]. Center. Y - (decimal) (bead [0]. Radius / 2); } vingine {Properties. Settings. Default.x = (decimal) bead [0]. Center. X + (decimal) (bead [0]. Radius); Mali. Settings. Default.y = (decimal) bead [0]. Center. Y - (decimal) (bead [0]. Radius); } Mali. Settings. Default.size = 15; Mali. Settings. Default.height = 15; } mwingine {

CircleSegment duara = thres. HoughCircles (HoughMethods. Gradient, 2, /*thres. Rows/4*/ 5, 200, 100, 60, 180);

ikiwa (miduara. Urefu> 1) {Orodha xs = miduara Chagua (c => c. Center. X). LoList (); Aina (); Orodha ys = miduara Chagua (c => c. Center. Y). LoList (); aina ();

wastani wa kati = (int) xs [xs. Count / 2];

wastani wa kati = = int) ys [ys Hesabu / 2];

ikiwa (wastaniX> picha. Upana - 15)

wastani = picha. Upana - 15; ikiwa (wastaniY> picha. Urefu - 15) wastaniY = picha. Urefu - 15;

picha. Circle (wastaniX, wastaniY, 100, Scalar mpya (0, 0, 150), 3);

ikiwa (kugundua) {

Mali. Settings. Default.x = wastaniX - 7; Mali. Settings. Default.y = wastaniY - 7; Mali. Settings. Default.size = 15; Mali. Settings. Default.height = 15; }}}}}

Rect r = mpya Rect ((int) Properties. Settings. Default.x, (int) Mali. Settings. Default.y, (int) Mali. Settings. Default.size, (int) Mali. Settings. Default.height);

Mfano wa shanga la Mat = Mfano mpya (picha, r);

Scalar avgColor = Cv2. Mean (beadSampuli); detectedColor = Colour. FromArgb ((int) avgColor [2], (int) avgColor [1], (int) avgColor [0]);

picha Mstatili (r, Scalar mpya (0, 150, 0));

dirisha. ShowImage (picha);

Cv2. Subiri Funguo (1); videoKukimbia = kweli; }

videoKukimbia = uwongo;

} }

kamera ya utupu ya kibinafsiStartBtn_Click (mtumaji wa vitu, Mikutano ya Matukio e) {

ikiwa (cameraStartBtn. Text == "anza") {

cvThread = Thread mpya (ThreadStart mpya (cvThreadFunction)); runVideo = kweli; cvThread. Start (); cameraStartBtn. Text = "simama"; wakati (! video Mbio) Thread. Sleep (100);

sasishaColorTimer. Start ();

} mwingine {

runVideo = uwongo; cvThread. Jiunga na (); cameraStartBtn. Text = "kuanza"; }}

Rangi

Sasa, tunaweza kujua rangi ya shanga, na kuamua kulingana na rangi hiyo ni chombo gani cha kuiangusha.

Hatua hii inategemea kulinganisha rangi. Tunataka kuwa na uwezo wa kutofautisha rangi kupunguza kikomo cha uwongo, lakini pia kuruhusu kizingiti cha kutosha kupunguza hasi. Kulinganisha rangi ni ngumu sana kushangaza, kwa sababu njia ambazo kompyuta huhifadhi rangi kama RGB, na jinsi wanadamu wanavyoona rangi haziendani sawa. Kufanya mambo kuwa mabaya zaidi, rangi ya nuru rangi inayoangaliwa chini pia inapaswa kuzingatiwa.

Kuna algorithm ngumu ya kuhesabu tofauti ya rangi. Tunatumia CIE2000, ambayo hutoa nambari karibu na 1 ikiwa rangi 2 zingeweza kutofautishwa na mwanadamu. Tunatumia maktaba ya ColourMine C # kufanya hesabu hizi ngumu. Thamani ya DeltaE ya 5 imepatikana kutoa maelewano mazuri kati ya chanya bandia na hasi ya uwongo.

Kwa kuwa mara nyingi kuna rangi nyingi basi vyombo, nafasi ya mwisho imehifadhiwa kama pipa la kukwama. Kwa ujumla niliweka hizi kando kukimbia ingawa mashine kwenye kupitisha kwa pili.

Orodha

rangi = Orodha mpya (); Orodha ya rangiPanels = Orodha mpya (); Orodha rangiTxts = Orodha mpya (); Orodha ya rangiCnts = Orodha mpya ();

const int numColorSpots = 18;

const int haijulikaniColorIndex = 18; int findColorPosition (Rangi c) {

Console. WriteLine ("Kupata rangi …");

var cRGB = mpya Rgb ();

cRGB. R = cR; cRGB. G = c. G; cRGB. B = c. B;

int boraMatch = -1;

mechi mbiliDelta = 100;

kwa (int i = 0; i <colours. Count; i ++) {

var RGB = mpya Rgb ();

RGB. R = rangi . R; RGB. G = rangi . G; RGB. B = rangi . B;

delta mbili = cRGB. Care kulinganisha (RGB, CieDe2000Comparison ());

// delta mbili = deltaE (c, rangi ); Console. WriteLine ("DeltaE (" + i. ToString () + "):" + delta. ToString ()); ikiwa (delta <matchDelta) {matchDelta = delta; boraMatch = i; }}

ikiwa (matchDelta <5) {Console. WriteLine ("Imepatikana! (Posn:" + bestMatch + "Delta:" + matchDelta + ")"); kurudi boraMatch; }

ikiwa (colours. Count <numColorSpots) {Console. WriteLine ("Rangi Mpya!"); Ongeza (c); hii. AnzaInvoke (Action mpya (setBackColor), kitu kipya {color. Count - 1}); andikaOutColors (); kurudi (rangi. Hesabu - 1); } mwingine {Console. WriteLine ("Rangi isiyojulikana!"); kurudi haijulikaniColorIndex; }}

Kupanga Mantiki

Kazi ya upangaji huleta pamoja vipande vyote ili kupanga shanga. Kazi hii inaendesha kwa uzi uliowekwa wakfu; kusonga sahani ya juu, kugundua rangi ya shanga, kuiweka kwenye pipa, kuhakikisha kuwa sahani ya juu inakaa sawa, kuhesabu shanga, nk. Pia huacha kukimbia wakati pipa wa kukamata umejaa - Vinginevyo tunaishia tu na shanga zinazofurika.

Thread colourTestThread; runtest ya boolean = uwongo; Jaribio la rangi tupu () {

ikiwa (! juu. Waliohusika)

juu. Kuhusika = kweli;

ikiwa (! chini. Imejumuishwa)

chini. Engaged = kweli;

wakati (runtest) {

Magnet inayofuata (kweli);

Thread Kulala (100); jaribu {if (magSensor. SensorValue <(magSensorMax - 4)) alignMotor (); } kamata {alignMotor (); }

Kamera inayofuata (kweli);

kugundua = kweli;

wakati (detectCnt <5) Thread. Sleep (25); Console. WriteLine ("Tambua Hesabu:" + detectCnt); kugundua = uwongo;

Rangi c = rangi iliyogunduliwa;

AnzaInvoke (Action mpya (setColorDet), kitu kipya {c}); int i = pata Nafasi ya Rangi (c);

SetBottomPosition (i, kweli);

inayofuataHole (kweli); rangiCnts ++; hii. AnzaInvoke (Action mpya (setColorTxt), kitu kipya {i}); Thread Kulala (250);

ikiwa (colorCnts [haijulikaniColorIndex]> 500) {

juu. Kushirikishwa = uwongo; chini. Engaged = uongo; runtest = uwongo; Anza Invoke (Action mpya (setGoGreen), null); kurudi; }}}

rangi ya batiliTestBtn_Click

ikiwa (colourTestThread == null ||! colourTestThread. IsAlive) {colourTestThread = Thread mpya (ThreadStart mpya (colourTest)); runtest = kweli; Anza (); colourTestBtn. Text = "ACHA"; colourTestBtn. BackColor = Rangi. Red; } mwingine {runtest = uongo; colourTestBtn. Text = "KWENDA"; rangiTestBtn. BackColor = Rangi. Green; }}

Kwa wakati huu, tuna programu ya kufanya kazi. Biti zingine za nambari ziliachwa nje ya kifungu hicho, kwa hivyo angalia chanzo ili kuiendesha.

Mashindano ya Macho
Mashindano ya Macho

Tuzo ya pili katika Mashindano ya Optics

Ilipendekeza: