Một trong những thứ mà tôi cảm thấy tuyệt vời nhất đối với một chiếc smartphone là nó có khả năng cảm ứng chuyển động và hướng. Với các thiết bị của Apple bạn có thể sử dụng cảm biến gia tốc(Accelerometers) và cảm biến con quay hồi chuyển(Gyroscopes) theo 3 trục x, y, z. Trong bài viết này chúng ta sẽ cùng nhau tạo ra một ứng dụng nhỏ để tìm hiểu qua về chúng.

I)Tạo giao diện

-Giao diện của chúng ta sẽ làm một cách đơn giản nhất để có thể hiển thị 12 vía trị. Chúng ta sẽ theo dõi được giá trị cao nhất giá trị hiện tại của Acceleration và góc xoay theo chiều trục X, Y, Z.

-Sau khi tạo project mới các bạn vào storyboards.

-Ở storyboards các bạn kéo 25 labels vào view.  Chúng ta sẽ lấy ra 12 labels để hiển thị dữ liệu về mỗi trục X, Y, Z. Các bạn bạn thay đổi tên các labels và thêm 1 cái nút theo hình dưới đây.

Tiếp theo chúng ta sẽ liên kết các đối tượng ngoài view vào trong file viewcontroller. Các bặt đặt tên tương ứng với các đôi tượng ngoài view và action của nút các bạn đặt tên resetMaxValue.

import CoreMotion
class ViewController: UIViewController{
    @IBOutlet weak var rollLabel: UILabel!
    @IBOutlet weak var pinchLabel: UILabel!
    @IBOutlet weak var yawLabel: UILabel!
    
    @IBOutlet var accX: UILabel!
    @IBOutlet var accY: UILabel!
    @IBOutlet var accZ: UILabel!
    
    @IBOutlet var maxAccX: UILabel!
    @IBOutlet var maxAccY: UILabel!
    @IBOutlet var maxAccZ: UILabel!
    
    @IBOutlet var rotX: UILabel!
    @IBOutlet var rotY: UILabel!
    @IBOutlet var rotZ: UILabel!
    
    @IBOutlet var maxRotX: UILabel!
    @IBOutlet var maxRotY: UILabel!
    @IBOutlet var maxRotZ: UILabel!
    
    
    @IBAction func resetMaxValues(sender: AnyObject) 
    {
    }
}

II) Cảm biến gia tốc(Accelerometer) và Cảm biến con quay hồi chuyển(Gyroscope)

Cảm biến gia tốc(Accelerometer)

-Cảm biến gia tốc nó được sử dụng để đo gia tốc theo 3 chiều có nghĩa là ví dụ bạn lắc thiết bị mạnh thì giá trị các trục của nó cao và người lại.

-Khi thiết bị của bạn đặt trên bàn với mặt hình hướng lên trên thì máy đo gia tốc sẽ có giá trị là -1G theo chiều Z, và nếu mặt điện thoại úp xuống thì nó có giá trị 1G theo chiều Z.

-Nếu bạn giữ thẳng đứng chiếc điện thoại thì giá trị sẽ là -1G theo trục Y và xoay ngược lại thì sẽ là 1G. Tương tự khi bạn để màn hình điện thoại trước mặt mà xoay 1 góc 90 độ về bên trái thì bạn sẽ nhận được giá trị -1G theo trục X và ngược lại nếu quay bên phải bạn sẽ nhận giá trị là 1G.

Cảm biến con quay hồi chuyển(Gyroscope)

-Con quay hồi chuyển cảm biến được góc quay giữa các trục XYZ. Cùng với accelerometer là 2 công cụ cơ bản để cảm biến hành động.

III)Viết mã để test

Trong bài hướng dẫn này chúng ta sẽ sử dụng CoreMotion. Để thêm Core Motion vào ứng dụng ở target của ứng dụng ở Linked Frameworks and Libraries các bạn thêm Core Motion.

Bây giờ các bạn import Core Motion vào file ViewController. Tiép theo chúng ta sẽ thêm một số biến toàn cục có kiểu double  để lưu giá trị max của cảm biến gia tốc và sau đó chúng ta tạo thêm một thuộc tính có kiểu CMMotionManager.

Dưới đây là đoạn mã của file ViewController:

    //Instance Variables
    
    var currentMaxAccelX: Double = 0.0
    var currentMaxAccelY: Double = 0.0
    var currentMaxAccelZ: Double = 0.0
    
    var currentMaxRotX: Double = 0.0
    var currentMaxRotY: Double = 0.0
    var currentMaxRotZ: Double = 0.0
    
    var movementManager = CMMotionManager()
    
    //Outlets
    
    @IBOutlet var accX: UILabel!
    @IBOutlet var accY: UILabel!
    @IBOutlet var accZ: UILabel!
    
    @IBOutlet var maxAccX: UILabel!
    @IBOutlet var maxAccY: UILabel!
    @IBOutlet var maxAccZ: UILabel!
    
    @IBOutlet var rotX: UILabel!
    @IBOutlet var rotY: UILabel!
    @IBOutlet var rotZ: UILabel!
    
    @IBOutlet var maxRotX: UILabel!
    @IBOutlet var maxRotY: UILabel!
    @IBOutlet var maxRotZ: UILabel!
    
    
    @IBAction func resetMaxValues(sender: AnyObject) {
    }

Tiếp theo chúng ta sẽ khởi tạo giá trị cho các biến:

override func viewDidLoad() {
        
        currentMaxAccelX = 0
        currentMaxAccelY = 0
        currentMaxAccelZ = 0
        
        currentMaxRotX = 0
        currentMaxRotY = 0
        currentMaxRotZ = 0
        
        movementManager.gyroUpdateInterval = 0.2
        movementManager.accelerometerUpdateInterval = 0.2
        
        //Start Recording Data        
        movementManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()!) { (accelerometerData: CMAccelerometerData?, NSError) -> Void in
            
            self.outputAccData(accelerometerData!.acceleration)
            if(NSError != nil) {
                print("\(NSError)")
            }
        }
        
        movementManager.startGyroUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: { (gyroData: CMGyroData?, NSError) -> Void in
            self.outputRotData(gyroData!.rotationRate)
            if (NSError != nil){
                print("\(NSError)")
            }  
        })  
    }

Trong đoạn mã này, chúng ta đâu tiên set giá trị 0 cho kiểu double. Sau đó chúng ta khởi tạo biến motionManager, tiếp theo chúng ta cập nhật khoảng thời gian cập nhật theo mini giây.

Tiếp theo chúng ta gọi phương thức startAccelerometerUpdatesToQueue từ biến motionManager, phương thức trên sẽ nói cho thuộc tính motionManger bắt đầu gửi các cảm biến gia tốc....

Tiếp theo chúng ta sẽ gọi các phương thức outputAccelertionData để cập nhật dữ liệu lên giao diện.

Dưới đây là code của 2 phương thức:

func outputAccData(acceleration: CMAcceleration){
        
        accX?.text = "\(acceleration.x).2fg"
        if fabs(acceleration.x) > fabs(currentMaxAccelX)
        {
            currentMaxAccelX = acceleration.x
        }
        
        accY?.text = "\(acceleration.y).2fg"
        if fabs(acceleration.y) > fabs(currentMaxAccelY)
        {
            currentMaxAccelY = acceleration.y
        }
        
        accZ?.text = "\(acceleration.z).2fg"
        if fabs(acceleration.z) > fabs(currentMaxAccelZ)
        {
            currentMaxAccelZ = acceleration.z
        }
        maxAccX?.text = "\(currentMaxAccelX).2f"
        maxAccY?.text = "\(currentMaxAccelY).2f"
        maxAccZ?.text = "\(currentMaxAccelZ).2f"
        
        
    }
    
    func outputRotData(rotation: CMRotationRate){
        rotX?.text = "\(rotation.x).2fr/s"
        if fabs(rotation.x) > fabs(currentMaxRotX)
        {
            currentMaxRotX = rotation.x
        }
        
        rotY?.text = "\(rotation.y).2fr/s"
        if fabs(rotation.y) > fabs(currentMaxRotY)
        {
            currentMaxRotY = rotation.y
        }
        
        rotZ?.text = "\(rotation.z).2fr/s"
        if fabs(rotation.z) > fabs(currentMaxRotZ)
        {
            currentMaxRotZ = rotation.z
        }
        maxRotX?.text = "\(currentMaxRotX).2f"
        maxRotY?.text = "\(currentMaxRotY).2f"
        maxRotZ?.text = "\(currentMaxRotZ).2f"
    }

Và cuối cùng chúng ta sẽ cần là viết mã cho nút resetMaxValues:

@IBAction func resetMaxValues(sender: AnyObject) {
        currentMaxAccelX = 0
        currentMaxAccelY = 0
        currentMaxAccelZ = 0
        
        currentMaxRotX = 0
        currentMaxRotY = 0
        currentMaxRotZ = 0
    }

Nếu bạn chạy bạn có thể thấy màn hình như dưới đây, nhưng chú ý các bạn sẽ phải chạy ở thiết bị thật.

Nguồn bài viết

Khóa học lập trình di động tại Techmaster:

Để cài đặt MacOSX lên phần cứng không phải Apple liên hệ chuyên gia cài Hackintosh:

  • Nguyễn Minh Sơn: 01287065634
  • Huỳnh Minh Sơn: 0936225565
  • Website: caidatmacos.com
Tham gia ngay khoá học lập trình iOS, hình thức học tập rất linh hoạt cho bạn lựa chọn và sẽ có mức học phí khác nhau tuỳ theo bạn chọn học Online, Offline hoặc FlipLearning(Kết hợp giữa Online và Offline). Ngoài ra bạn có thể tham gia thực tập toàn thời gian tại Techmaster để rút ngắn thời gian học và tăng cơ hội việc làm.