{"id":1077,"date":"2022-11-29T11:42:35","date_gmt":"2022-11-29T02:42:35","guid":{"rendered":"https:\/\/rfsec.ddns.net\/db\/?p=1077"},"modified":"2022-11-29T11:52:52","modified_gmt":"2022-11-29T02:52:52","slug":"raspberrypi4%e3%81%a7%ef%bc%92%e8%bb%b8%e3%82%b9%e3%83%86%e3%83%83%e3%83%94%e3%83%b3%e3%82%b0%e3%83%a2%e3%83%bc%e3%82%bf%e3%81%ae%e5%88%b6%e5%be%a1%e3%81%a8usb%e3%82%ab%e3%83%a1%e3%83%a9%e3%81%ae","status":"publish","type":"post","link":"https:\/\/rfsec.ddns.net\/db\/?p=1077","title":{"rendered":"RaspberryPi4\u3067\uff12\u8ef8\u30b9\u30c6\u30c3\u30d4\u30f3\u30b0\u30e2\u30fc\u30bf\u306e\u5236\u5fa1\u3068USB\u30ab\u30e1\u30e9\u306e\u753b\u50cf\u51e6\u7406\u3092\u8a66\u3057\u3066\u307f\u308b\u3002"},"content":{"rendered":"\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"890\" src=\"https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221124_080317095.jpg\" alt=\"\" class=\"wp-image-1078\" srcset=\"https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221124_080317095.jpg 1024w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221124_080317095-300x261.jpg 300w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221124_080317095-768x668.jpg 768w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221124_080317095-624x542.jpg 624w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/www.waveshare.com\/product\/stepper-motor-hat-b.htm?___SID=U\" target=\"_blank\" rel=\"noreferrer noopener\">waveshar\u306epiHat<\/a><\/figcaption><\/figure>\n\n\n\n<p><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221129_021028669-761x1024.jpg\" alt=\"\" class=\"wp-image-1079\" width=\"313\" height=\"420\" srcset=\"https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221129_021028669-761x1024.jpg 761w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221129_021028669-223x300.jpg 223w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221129_021028669-768x1033.jpg 768w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221129_021028669-1142x1536.jpg 1142w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221129_021028669-1523x2048.jpg 1523w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221129_021028669-624x839.jpg 624w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2022\/11\/PXL_20221129_021028669.jpg 1869w\" sizes=\"auto, (max-width: 313px) 100vw, 313px\" \/><figcaption class=\"wp-element-caption\">\u30ab\u30e1\u30e9\u7528\u30ec\u30f3\u30ba\u3092\uff12\u8ef8\u30de\u30a6\u30f3\u30c8\u3078<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"2022 11 24 17 51 39\" width=\"625\" height=\"469\" src=\"https:\/\/www.youtube.com\/embed\/PtfaD-zy0-0?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-python\" data-file=\"optrack.py\" data-lang=\"Python\"><code>import cv2\nimport time\nimport pigpio\nimport datetime\nimport threading\nimport os\n\npi = pigpio.pi()\nsMin=0.005\nsMax=0.0002\nSTP1 = 19\nDIR1 = 13\nEBL1 = 12\nSTP2 = 18\nDIR2 = 24\nEBL2 = 4\nM=1\/32   # microstep\nN=200   # stepper\nFOV = 20 # Field of view\nR=M*360\/N       # 1-Step\u306e\u56de\u8ee2\u89d2\u5ea6\nRR= 1 \/ R       # \uff11\u5ea6\u306e\u56de\u8ee2\u306b\u5fc5\u8981\u306aSTEP\u6570\npX=0\npY=0\ncAz = 0\ncEv = 0\ntrack = False\nmode =&#39;F&#39;\nreverse = False\nLimit = False\ncircle = True\nth = 170\nLowEv,HighEv = 0, 80\nRightAz, LeftAz = 0,100\ncAz, cEv = 0, 0\noAz, oEv = 55, 45\npi.set_mode(STP1,pigpio.OUTPUT)\npi.set_mode(DIR1,pigpio.OUTPUT)\npi.set_mode(EBL1,pigpio.OUTPUT)\npi.set_mode(EBL2,pigpio.OUTPUT)\npi.set_mode(STP2,pigpio.OUTPUT)\npi.set_mode(DIR2,pigpio.OUTPUT)\ndelay_Az = 0.0005\ndelay_Ev = 0.002\n\ndef goto(oAz,oEv):\n    global cAz,cEv,STP1,STP2,DIR1,DIR2,delay_Az,delay_Ev\n    tA, tE = oAz - cAz, oEv - cEv\n    rotAz(tA)\n    rotEv(tE)\n\ndef key(k):\n    global cAz,cEv,STP1,DIR1,STP2,DIR2,th\n    global track,reverse,circle,dW,dH,Limit\n    global LowEv,HighEv ,RightAz, LeftAz\n    if k == ord(&#39;b&#39;):\n        cAz = 0\n        cEv = 0\n    elif k == ord(&#39;j&#39;) or k==81:\n        rotAz(-0.5625)\n    elif k == ord(&#39;J&#39;):\n        LeftAz=round(cAz,1)\n    elif k == ord(&#39;k&#39;) or k==83:\n        rotAz(0.5625)\n    elif k == ord(&#39;K&#39;):\n        RightAz=round(cAz,1)\n    elif k == ord(&#39;h&#39;):\n        rotAz(-5.625)\n    elif k == ord(&#39;l&#39;):\n        rotAz(5.625)\n    elif k == ord(&#39;i&#39;) or k==82:\n        rotEv(1)\n    elif k == ord(&#39;I&#39;):\n        HighEv=round(cEv,1)\n    elif k == ord(&#39;m&#39;) or k==84:\n        rotEv(-1)\n    elif k == ord(&#39;o&#39;):\n        goto(30,40)\n    elif k == ord(&#39;M&#39;):\n        LowEv=round(cEv,1)\n    elif k == ord(&#39;a&#39;):\n        th = th - 2\n    elif k == ord(&#39;s&#39;):\n        th = th + 2\n    elif k == ord(&#39;t&#39;):\n        track = not track\n    elif k == ord(&#39;p&#39;):\n        Limit = not Limit\n    elif k == ord(&#39;r&#39;):\n        reverse = not reverse\n    elif k == ord(&#39;@&#39;):\n        print(&#39;AzL=&#39;,round(LeftAz,1),&#39;,AzR=&#39;,round(RightAz,1),&#39;,EvH=&#39;,round(HighEv,1),&#39;,EvL=&#39;,round(LowEv,1))\n    elif k == ord(&#39;c&#39;):\n        cAz, cEv = 10, 22\n        LeftAz, RightAz = -9, 157\n        HighEv, LowEv = 70, 20\n    elif k == ord(&#39;z&#39;):\n        tmp=input()\n        tmp=tmp.split(&#39;,&#39;)\n        cAz = float(tmp[0])\n        cEv = float(tmp[1])\n    elif k == ord(&#39;x&#39;):\n        tmp=input()\n        tmp=tmp.split(&#39;,&#39;)\n        dW = float(tmp[0])\n        dH = float(tmp[1])\n        mH, mW = dH - cEv, dW - cAz\n        print(&#39;Az:&#39;,cAz,&#39; Ev:&#39;,cEv,&#39; dW:&#39;,mW,&#39; dH:&#39;,mH)\n\n        rotAz(mW)\n        rotEv(mH)\n        cAz, cEv = dW, dH\n\ndef do_move(N,STP,delay):\n    #print(N,STP,delay)\n    for i in range(N):\n        pi.write(STP,1)\n        time.sleep(delay)\n        pi.write(STP,0)\n        time.sleep(delay)\n    pi.write(EBL1,0)\n\ndef check(Az,Ev):\n    global LowEv,HighEv ,RightAz, LeftAz\n    AzR,AzL,EvH,EvL = False,False,False,False\n    f = False\n    if Az&gt; RightAz:\n        AzR, f =True, True\n    if Az&lt; LeftAz:\n        AzL, f=True, True\n    if Ev&gt;HighEv:\n        EvH, f=True, True\n    if Ev&lt;LowEv:\n        EvL, f=True, True\n    return f,AzR,AzL,EvH,EvL\n\ndef rotAz(deg):\n    pi.write(EBL2,1)\n    rot(deg,STP2,DIR2, delay_Az)\n\ndef rotEv(deg):\n    pi.write(EBL1,1)\n    #time.sleep(0.5)\n    rot(deg,STP1,DIR1, delay_Ev)\n\ndef rot(deg,STP,DIR,delay):\n    global cEv,cAz,LeftAz,LowEv,HighEv\n    tmp=deg\n    if tmp&lt;0:\n        dDIR=1\n        tmp=-tmp\n    else:\n        dDIR=0\n\n    if STP==STP2:\n        N=int(0.5+200*32*tmp\/360)\n        if Limit:\n            if AzL and (cAz &gt; LeftAz):\n                N = 0\n            if AzR and (cAz &lt; RightAz):\n                N = 0\n        if N != 0:\n            cAz=cAz+deg\n    else:\n        N=int(0.5+48*120*tmp\/360) # 48\/360 1\/120 gear and Full STEP\n        if Limit:\n            if EvL and (cEv&lt;LowEv):\n                N = 0\n            if EvH and (cEv&gt;HighEv):\n                N = 0\n        if N != 0:\n            cEv=cEv+deg\n    pi.write(DIR,dDIR)\n    do_move(N,STP,delay)\n    #thread2 = threading.Thread(target= do_move,args=(N,STP,delay,))\n    #thread2.start()\n\ndef jyusin(img):\n    global W2,H2\n    mu = cv2.moments(img, False)\n    try:\n        x,y= int(mu[&quot;m10&quot;]\/mu[&quot;m00&quot;]) , int(mu[&quot;m01&quot;]\/mu[&quot;m00&quot;])\n        c=(0,255,0)\n        focus = True\n    except ZeroDivisionError:\n        x = W2\n        y = H2\n        c=(0,0,255)\n        focus = False\n    return focus,x,y,c\n\ndef finish(n):\n    global writer,track,Limit,f_name\n    print(f_name,&#39;closed&#39;)\n    writer.release()\n    new_name=f_name.replace(&#39;.avi&#39;,&#39;-&#39;+str(n)+&#39;.avi&#39;)\n    os.rename(f_name,new_name)\n    writer ,f_name= None, &quot;&quot;\n    track = False\n    Limit = False\n    goto(55,50)\n    track = True\n    Limit = True\n\nfontFace =cv2.FONT_HERSHEY_SIMPLEX\n# VideoCapture \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\u3057\u307e\u3059\ncapture = cv2.VideoCapture(0)\n#capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*&#39;mp4v&#39;)\ncapture.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)\ncapture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)\ncapture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*&quot;MJPG&quot;))\n# \u5e45\nW = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))\n# \u9ad8\u3055\nH = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))\nprint(&#39;Size W:&#39;,W,&#39;  H:&#39;,H)\nhalf = False\nW2, H2 = int(W\/2), int(H\/2)\nWW, HH = W2, H2\nif W&gt;1024:      # resize\n    W2, H2=int(W\/4), int(H\/4)\n    half = True\nfourcc = cv2.VideoWriter_fourcc(*&#39;h264&#39;)\nfourcc = cv2.VideoWriter_fourcc(*&#39;XVID&#39;)\n#fourcc = cv2.VideoWriter_fourcc(*&#39;mp4v&#39;)\nwriter = None\nPATH=&quot;\/home\/mars\/pWork\/&quot;\nAzR,AzL,EvH,EvL = False,False,False,False\nf_name=&quot;&quot;\ni=0\nwhite,blue,red,green=(255,255,255),(255,0,0),(0,0,255),(0,255,000)\nconfig=&#39;optrack.ini&#39;\nif os.path.exists(config):\n    f = open(config)\n    s = f.read()\n    t = s.split(&#39;,&#39;)\n    cAz, cEv, LowEv, HighEv ,RightAz, LeftAz = float(t[0]),float(t[1]),float(t[2]),float(t[3]),float(t[4]),float(t[5])\n\nwhile(True):\n    ret, frame = capture.read()\n    if half:\n        frame = cv2.resize(frame, dsize=(WW, HH))\n    now=datetime.datetime.today()\n    if reverse:\n        img1 =  cv2.cvtColor(cv2.bitwise_not(frame) ,cv2.COLOR_BGR2GRAY)\n    else:\n        img1 = cv2.cvtColor(frame ,cv2.COLOR_BGR2GRAY)\n    # \u4e8c\u5024\u5316(\u95be\u5024100\u3092\u8d85\u3048\u305f\u753b\u7d20\u3092255\u306b\u3059\u308b\n    ret, img_th = cv2.threshold(img1, th, 255, cv2.THRESH_BINARY)\n    cv2.imshow(&#39;frame2&#39;,img_th)\n    k=cv2.waitKey(1) & 0xFF\n    key(k)\n    if k == ord(&#39;q&#39;):\n        break\n\n    # \u91cd\u5fc3\u691c\u51fa\n    focus,x,y,c = jyusin(img_th)\n    cc = white\n    if focus:\n        if track:\n            i=i+1\n            if writer is None:\n                f_name =&#39;video\/&#39;+now.strftime(&quot;%Y-%m-%d_%H:%M:%S&quot;)+&#39;.avi&#39;\n                writer=cv2.VideoWriter(f_name, fourcc, 15, (WW,HH))\n                print(&#39;Record Start:&#39;,f_name)\n                time_start = time.time()\n            else:\n                writer.write(frame)\n                cc = green\n                if (time.time() - time_start) &gt;20:\n                    finish(i)\n                    i = 0\n        else:\n            if writer is not None:\n                finish(i)\n                i = 0\n\n    else:\n        if (writer is not None):\n            writer.write(frame)\n            if  ((time.time()- time_start)&gt;20):\n                finish(i)\n                i = 0\n\n    if circle:\n        cv2.circle(frame, (x,y), 4, color=c, thickness=1)\n        cv2.circle(frame, (x,y), 10, color=c, thickness=1)\n        cv2.circle(frame, (x,y), 16, color=c, thickness=1)\n\n    f, AzL,AzR,EvH,EvL=check(cAz,cEv)\n    cf = green\n    if f:\n        cf = red\n    dW = (WW*0.5 - x)*0.001\n    if track and abs(dW)&gt;0.02:\n        rotAz(-dW)    #  cAz = cAz + dW * R\n\n    dH = (HH*0.5 - y)*0.001\n    if track and abs(dH)&gt;0.02:\n        rotEv(dH)     # cEv = cEv + dH*R\n\n    text=&#39;T:&#39;+str(track)+&#39; L:&#39;+str(Limit)+&#39; &#39;+now.strftime(&quot;%H:%M:%S&quot;)+ &#39; TH=&#39; +str(th)+&#39;  X=&#39;+str(x)+&#39;  Y=&#39;+str(y)+&quot; F#:&quot;+str(i)+&quot; File:&quot;+f_name\n    text2=&quot;Az:&quot;+str(round(cAz,2))+&quot;  Ev:&quot;+str(round(cEv,2))+&quot; F:&quot;+str(f)+&quot;  AzL:&quot;+str(AzL)+&quot; AzR:&quot;+str(AzR)+&quot; EvH:&quot;+str(EvH)+&quot; EvL:&quot;+str(EvL)\n    text3=&quot;Az_step:&quot;+str(round(dW,2))+&quot;  Ev_step:&quot;+str(round(dH,2)) + &quot; Video Reverse:&quot; + str(reverse)\n    text4=&quot;AzL:&quot;+str(LeftAz)+&quot; AzR:&quot;+str(RightAz)+&quot; EvH:&quot;+str(HighEv)+&quot; EvL:&quot;+str(LowEv)\n    img = cv2.putText(frame, text, (10,20), fontFace, 0.5,color=cc)\n    img = cv2.putText(frame, text2, (10,40), fontFace, 0.5,color=cf)\n    img = cv2.putText(frame, text3, (10,60), fontFace, 0.5,color=cc)\n    img = cv2.putText(frame, text4, (10,80), fontFace, 0.5,color=cc)\n    cv2.imshow(&#39;frame&#39;,img)\n\nprint(&#39;Done!&#39;)\nf=open(config,&#39;w&#39;)\nmsg=str(cAz)+&#39;,&#39;+str(cEv)+&#39;,&#39;+str(LowEv)+&#39;,&#39;+str(HighEv)+&#39;,&#39;+str(RightAz)+&#39;,&#39;+str(LeftAz)\nf.write(msg)\nf.close()\ncapture.release()\nif writer is not None:\n    writer.release()\ncv2.destroyAllWindows()\npi.write(EBL1,0)\npi.write(EBL2,0)<\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1077","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"featured_image_src":null,"author_info":{"display_name":"mars","author_link":"https:\/\/rfsec.ddns.net\/db\/?author=1"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/1077","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1077"}],"version-history":[{"count":3,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/1077\/revisions"}],"predecessor-version":[{"id":1085,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/1077\/revisions\/1085"}],"wp:attachment":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1077"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1077"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1077"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}