{"id":24310384,"url":"https://github.com/hisarcs/pi20","last_synced_at":"2025-10-04T00:42:59.109Z","repository":{"id":93376932,"uuid":"229811201","full_name":"HisarCS/Pi20","owner":"HisarCS","description":"This GitHub repository was created for the purposes of easing the understanding between software, sensors and movables on the robot kits designed by HisarCS for attendees of Pi Wars Turkey 2020.","archived":false,"fork":false,"pushed_at":"2024-08-30T23:42:23.000Z","size":62,"stargazers_count":4,"open_issues_count":1,"forks_count":2,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-09-26T15:37:48.552Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HisarCS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-12-23T19:27:55.000Z","updated_at":"2022-05-20T10:12:36.000Z","dependencies_parsed_at":"2023-04-22T07:31:34.664Z","dependency_job_id":"7373ac35-b450-43ef-8bd1-0809c3de7dc2","html_url":"https://github.com/HisarCS/Pi20","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/HisarCS/Pi20","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HisarCS%2FPi20","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HisarCS%2FPi20/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HisarCS%2FPi20/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HisarCS%2FPi20/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HisarCS","download_url":"https://codeload.github.com/HisarCS/Pi20/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HisarCS%2FPi20/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278250079,"owners_count":25955839,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-03T02:00:06.070Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-17T06:14:37.931Z","updated_at":"2025-10-04T00:42:59.098Z","avatar_url":"https://github.com/HisarCS.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## PiWars Türkiye 2020: HisarCS tarafından dağıtılan robot kitleri için python kütüphanesi  \n  \nBu python kütüphanesi, PiWars Türkiye 2020 katılımcılarının HisarCS tarafınndan hazırlanan robot kitlerindeki yazılımı, sensörleri ve hareketli parçaları kullanmalarını kolaylaştırmak amacıyla yapılmıştır.  \n\n\n## Kurulum\n\nPi20'yi indirmek için [pip](https://pip.pypa.io/en/stable/) paketleme yöneticisini kullanın.\n\n\n```\n$ sudo pip3 install Pi20\n```\n\nAlternatif olarak Github'dan indirmek de mümkün.\n```bash git clone https://github.com/HisarCS/Pi20.git\n$ git clone https://github.com/HisarCS/Pi20.git\n$ cd Pi20\n$ sudo python setup.py install\n```\n\n## Kullanım\n\n```python\nimport Pi20\n```\n## Belgeleme\n\nŞu anda bu kütüphanede 5 sınıf bulunmaktadır:\n- HizlandirilmisPiKamera (Pi Kamera ve opencv kullanmayı basitleştirmek ve optimize etmek için)\n- Kumanda (pygame'in Joystick sınıfını PS4 sixaxis kumandalar ile kullanmayı basitleştirmek için)\n- MotorKontrol (Raspberry Pi için Pololu DRV8835 motor sürücü devresinin kullanımını kolaylaştırmak için)\n- ServoKontrol (Raspberry Pi'ın GPIO pinleri ile servo kontrol etmeyi kolaylaştırmak için)\n- UltrasonikSensoru (Raspberry Pi'ın GPIO pinleri ile HC-SR04 ultrasonik uzaklık sensörünü kullanmayı kolaylaştırmak için)\n\nPerformans sebeplerinden dolayı sınıfların bir kısmı multithreading kullanmaktadır. Bu yazılımın bir kısmının diğerlerinin performansını değiştirmesini engellemek içindir. Multithreading özellikle kullanıldığı sınıflar HizlandirilmisPiKamera (hem görüntüyü almak hem göstermek için), Kumanda (sürekli olarak kumanda değerlerini almak için) ve ServoKontrol (içindeki sleep fonksiyonlarının ana threadi durdurmasını engellemek için).\n\nHizlandirilmisPiKamera:\n-\n- Metodlar\n\n```python\n__veriGuncelle__()\n```\nPi Kameradan gelen verileri bir while loop'un içerisinde günceller.  Ana threadde çağırmak **tavsiye edilmez** çünkü program bu satırda takılacaktır.\n\n```python\nveriOkumayaBasla()\n```\nAna threadi yavaşlatmadan veriyi güncellemek için yeni bir threadde ``` __veriGuncelle__()``` fonksiyonunu çağırır.  Bunu sadece başlangıçta kullanarak programın her yerinde kamera verilerine ulaşabilirsiniz.\n\n```python\nveriOku()\n```\nNumPy listesi olarak kameranın o andaki değerlerini geri döndürür.  Bu döndürdüğü NumPy listesi ise yukarıda bahsedildiği gibi ``` __veriGuncelle__()``` fonksiyonunda bir while loop içerisinde her zaman yenilenir.\n\n```python\n__kareyiGostermeyiGuncelle__()\n```\ngirilen parametreler dahilinde yeni opencv pencereleri açar ve pencereyi bir while loop içerisinde günceller. \"q\" tuşu ile pencere kapatılabilir.  Ana threadde çağırmak **tavsiye edilmez** çünkü program bu satırda takılacaktır.\n\n```python\nkareyiGoster()\n```\nAna threadi yavaşlatmadan bir pencere açmak için  ``` __kareyiGostermeyiGuncelle__()``` fonksiyonunu başka bir threadde çağırır.  İki parametre alır ve bunlar da pencerenin ismi ve pencerede gösterilecek görüntüdür. Farklı pencere isimleri ve görüntüleri kullanarak ve bunları da bir while loop içeirisinde çağırarak gösterilecek olan görüntüleri güncelleyebilirsiniz. Eğer parametre olarak hiçbir şey girilmezse fonksiyon varsayılan olarak kameranın ham görüntüsünü 'frame' isimli bir pencerede göstermeye başlar.\n\n- Örnek Kullanım\n\n```python\nfrom Pi20 import HizlandirilmisPiKamera\nfrom time import sleep\n\ncamera = HizlandirilmisPiKamera()\ncamera.veriOkumayaBasla()\nsleep(1)\n\nwhile True:\n\tcamera.kareyiGoster()\n```\nYukarıdaki örnek yeni bir HizlandirilmisPiKamera objesi oluşturur, ``` veriOkumayaBasla()```   fonksiyonu ile kameradan verileri almaya başlar ve while loop'un içinde de ``` kareyiGoster()```  fonksiyonu ile okunan verileri ekranda 'frame' isimli pencere oluşturup kameradan okunan ham verileri gösterir.\n\nKamera objesi çağırılınca varsayılan çözünürlük 640x480 dir. Eğer başka bir çözünürlük istiyorsanız, örneğin 1280x720, kamera objesini bu şekilde oluşturabilirsiniz:\n\n``` camera = HizlandirilmisPiKamera(cozunurluk=(1280, 720))```\n\nEğer ki sonradan yaptığınız görüntü işleme adımlarınızı da ayrı pencerelerde göstermek istiyorsanız ```kareyiGoster()```  fonksiyonunu birkaç kez kullanarak kodunuzu yavaşlatmadan pencereleri ayrı bir thread'de çalıştırabilirsiniz. Bunun için aşağıdaki kodu referans alabilirsiniz.\n\n```python\nfrom Pi20 import HizlandirilmisPiKamera\nimport imutils\nimport cv2\nfrom time import sleep\n\nkamera = HizlandirilmisPiKamera()\nkamera.veriOkumayaBasla()\nsleep(1)\n\nwhile True:\n\tkamera.kareyiGoster()\n\tyenidenBoyutlandirilmis = imutils.resize(kamera.veriOku(), width=300)\n\tkamera.kareyiGoster(\"yenidenBoyutlandirilmis\", yenidenBoyutlandirilmis)\n\tgri = cv2.cvtColor(kamera.veriOku(), cv2.COLOR_BGR2GRAY)\n\tkamera.kareyiGoster(\"siyah - beyaz\", gri)\n```\nYukarıdan da görüldüğü gibi, ```kareyiGoster()```  fonksiyonunu birkaç kez kullanarak görüntü işleme algoritmanızdaki farklı aşamaları ekranda izleyebilirsiniz. Ayrıca yukarıdaki programda, ilk kez ```veriOku()``` fonksiyonunu kullanmaktayız. Fonksiyon açıklamalarında da belirtildiği gibi, bize, kameranın o andaki gördüğü görüntüsünü geri döndürür. Biz de bunu kullanarak resmimizi yeniden boyutlandırabiliyoruz.\n\nKumanda\n-\n- Metodlar\n\n```python\n__yenile__()\n```\nKumandadan alınan verileri bir while döngüsü içerisinde yeniler. Ana threadde çağırmak **tavsiye edilmez** çünkü program bu satırda takılacaktır.\n\n```python\ndinlemeyeBasla()\n```\n```__yenile__()``` metodunu ayrı bir thread üzerinde çağırarak ana thread'in kullanılabilmesini sağlar.\n\n```python\nsolVerileriOku()\n```\nSoldaki joystick değerlerini iki float değeri, x ve y, olarak verir.\n\n```python\nsagVerileriOku()\n```\nSağdaki joystick değerlerini iki float değeri, x ve y, olarak verir.\n\n```python\nbutonlariOku()\n```\nBasılan bütün düğmeleri sayı değeri olarak bir arrayde geri verir.\n\n```python\nverileriOku()\n```\nKumandanın bütün değerlerini tuple tipinde geri verir ```(python solVerileriOku(), python sagVerileriOku(), python butonlariOku())```\n\n- Örnek Kullanım\n\n```python\nimport Pi20\n\njoystik = Pi20.Kumanda()\njoystik.dinlemeyeBasla()\n\nwhile True:\n\tlx, ly = joystik.solVerileriOku()\n\trx, ry = joystik.sagVerileriOku()\n\tbuttons = joystik.butonlariOku()\n\n\tprint(\"Sağ joystik değerleri: \", lx, ly)\n\tprint(\"Sol joystik değerleri: \", rx, ry)\n\n\tif(0 in buttons):\n\t\tprint(\"0 Butonu basıldı!\")\n```\nYukarıdaki kod bir Kumanda objesi oluşturur ve sol ve sağ joysticklerin değerlerini ekrana basarken aynı zamanda belirlenmiş bir stringi bir düğmeye basıldığında ekrana basar. ```dinlemeyeBasla()``` metodunun veri alabilmek için ana kod başlatıldığında çağırılması gerektiğini unutmayınız.\n\nMotorKontrol\n-\n- Metodlar\n\n```python\nhizlariAyarla(sagHiz, solHiz)\n```\npololu-drv8835-rpi kütüphanesini kullanarak motorların hızını ayarlar. Hız -480'den +480'e kadar değerler olarak verilebilir (-480 geriye doğru tam hız olur). Sağ ve sol hız değerleri motor sürücüsünün birinci ve ikinci motorlarına denk gelir.\n\n```python\nkumandaVerisiniMotorVerilerineCevirme(x, y)\n```\nMotor hız değerlerini kumanda verisine dayanarak geri verir. x ve y, kumandanın joystick x ve y değerlerini temsil eder ve 0 ve 1 arasında bir değer alır.\n\n- Örnek Kullanım\n\n```python\nimport Pi20\nmotorlar = Pi20.MotorKontrol()\n\nwhile True:\n\tmotorlar.hizlariAyarla(480, 480)\n```\nBu kod motorları başlatır ve ileri doğru tam hıza ayarlar.\n\n- Kumanda ile Örnek Kullanım\n\n```python\nimport Pi20\n\nmotorlar = Pi20.MotorKontrol()\n\njoystik = Pi20.Kumanda()\njoystik.dinlemeyeBasla()\n\nwhile True:\n\tlx, ly = joystik.solVerileriOku()\n\tsagHiz, solHiz = motorlar.kumandaVerisiniMotorVerilerineCevirme(lx, ly)\n\n\tmotorlar.hizlariAyarla(sagHiz, solHiz)\n```\nYukarıdaki kod motorlar ve kumanda objelerini başlatır ve bir while döngüsünün içine girer. Döngüdeyken  ```kumandaVerisiniMotorVerilerineCevirme()``` metodu motorların hız değerlerini bulmak için kullanılır.\n\nServoKontrol\n-\n- Metodlar\n\n```python\nsurekliDonmeyeAyarla()\ntekDonmeyeAyarla()\n```\nServoyu sürekli dönme ve tek sefer dönmeye ayarlar. Sürekli dönme modu dinamik olarak değerler verilmesini gerektirirken tek dönme servoyu verilen açıya getirir ve sonrasında uykuya geçer.\n\n```python\naciAyarla(aci)\n```\nServoyu derece cinsinden verilen açıya çevirir. Servo tek dönmeye ayarlıyken ayrı bir thread oluşturulur ve servo değeri istenen açıya gelince uyur.\n\n- Örnek Kullanım\n\nSürekli Dönme:\n```python\nimport Pi20\nfrom time import sleep\n\nservo = Pi20.ServoKontrol(35)\nservo.surekliDonmeyeAyarla()\n\naci = 0\nekle = 0\n\nwhile True:\n\tservo.aciAyarla(aci)\n\n\tif(aci == 180):\n\t\tekle = -1\n\telif(aci == 0):\n\t\tekle = 1\n\taci += ekle\n\tsleep(0.05)\n```\nBu durumda servo sürekli dönmeye ayarlıdır. Bir while döngüsü servonun açısını 1er 1er arttırır ve servoyu yeni açıya getirir.\n\nTek Dönme:\n```python\nimport Pi20\nfrom time import sleep\n\nservo = Pi20.ServoKontrol()\nservo.tekDonmeyeAyarla()\n\nwhile True:\n\tservo.aciAyarla(180)\n\tsleep(1)\n\tservo.aciAyarla(0)\n\tsleep(1)\n```\nBu durumda servo tek dönmeye ayarlıdır. Bir while döngüsü servonun açısını 1 saniye aralıklarla 180 ve 0 arasında değiştirir.\n\nUltrasonikSensoru\n-\n- Metodlar\n\n```python\nmesafeOku()\n```\nUltrasonik sensörün ölçtüğü mesafeyi geri verir.\n\n- Örnek Kullanım\n\n```python\nimport Pi20\n\nultra = Pi20.UltrasonikSensoru(38, 40)\nultra.mesafeOlcmeyeBasla()\nwhile True:\n\tanlikDeger = ultra.mesafeOku()\n\tprint(anlikDeger)\n```\nYukarıdaki kod ölçülen mesafeyi önce medyan ve sonra anlık değer olmak üzere ekrana basar. Yapıcının(constructor), ya da ultra nesnesi oluştururkenki kullandığımız kod satırı,  içindeki değerler ultrasonik sensörün takılı olduğu pinlerdir.\n\n\n## Katkıda Bulunma\nÇekme istekleri kabul edilir. Büyük değişikler için lütfen önce bir issue açarak istediğiniz değişikliği anlatın.\n\nLütfen testleri uygun şekilde güncellediğinizden emin olun.\n\n## Lisans\n[MIT](https://choosealicense.com/licenses/mit/)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhisarcs%2Fpi20","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhisarcs%2Fpi20","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhisarcs%2Fpi20/lists"}